Sin experiencia con shared_ptr<>
Me pregunto si el siguiente es un caso de uso apropiado y si es una buena idea devolver shared_ptr<>
al usuario.Uso apropiado de shared_ptr?
Tengo una estructura similar a un gráfico con múltiples conexiones entre los nodos. Durante la travesía del gráfico, a cada nodo se le asigna un valor (calculado a partir de nodos conectados) y deseo que el usuario pueda acceder al valor fácilmente. Todo esto se ve (muy simplificada) como este:
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
...
}
y el usuario llama:
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() << ...
Esto tiene la ventaja de que el usuario obtiene directamente el acceso a los nodos importantes para él (dependencias son a menudo poco interesante). Pero no estoy 100% seguro de si esta es una buena idea.
Gracias por su ayuda!
Editar: No hay dependencias circulares.
Puede encontrar esta pregunta, y las respuestas, algo relevantes: http://stackoverflow.com/questions/5629592/resource-leak-during-object-creation-c/ – Anton