Соответствующее использование shared_ptr?

Без опыта работы с 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() << ... 

Это имеет то преимущество, что пользователь получает прямой доступ к узлам, которые ему небезразличны (зависимости часто неинтересны). Но я не уверен на 100%, что это хорошая идея.

Спасибо за ваш вклад!

Изменить: нет циклических зависимостей.

8
задан bbtrb 15 April 2011 в 02:33
поделиться