我对 shared_ptr<>
没有经验,想知道以下是否是适当的用例,以及将 shared_ptr<>
返回给用户是否是一个好主意。
我有一个类似于图形的结构,节点之间有多个连接。在遍历图时,每个节点都被赋予一个值(通过连接节点计算得出),我希望用户能够轻松访问该值。整个过程看起来(非常简化)像这样:
class Pool;
class Node {
public:
typedef std::tr1::shared_ptr<Node> Ptr;
...
void compute_dependencies() {
...
// calls Pool to get a new Node instance
dependencies_.push_back(Pool::create_node(...));
...
}
// evaluate the current node
void evaluate() { /* use dependencies_ */ };
double value() const { if(evaluated) return value_; };
private:
std::vector<Node::Ptr> dependencies_; // vector<Node*> better?
dbl value_;
}
// Pool creates and owns all nodes
class Pool {
public:
static const Node::Ptr create_node(...); // create a new node
void traverse_and_evaluate();
private:
std::vector<Node::Ptr> allnodes; // appropriately sorted to ensure
// dependencies are evaluated
...
}
用户调用:
Pool pool();
Node::Ptr node1 = Pool::create_node(...);
Node::Ptr node2 = Pool::create_node(...);
....
pool.traverse_and_evaluate();
// ready to read out the now populated values
cout << node1->value() << " " << node2->value() << ...
这样做的好处是用户可以直接访问他关心的节点(依赖关系通常不重要)。但我不确定这是否是一个好主意。感谢您的反馈!编辑:没有循环依赖。