2012-07-01 3 views
1

У меня есть класс:Init ссылка с недопустимым значением

class node 
{ 
public: 

    node& parent; 
} 

Я хочу, чтобы установить значение parent, когда я знаю, его правильное значение:

node parent; 
... 

node n; // here node.parent is a not valid value 
n.parent = parent; 

Но я должен установить это значение в конструктор тоже. Как я могу сделать?

+0

Где именно в коде вам нужно установить его значение? И что вы хотите, чтобы его ценность была до этого? –

+0

Как я писал: только когда я знаю, каково его значение - недопустимое значение. – gliderkite

+0

Тогда вы не можете использовать ссылку. Для справки нет такой вещи, как «недопустимое значение». –

ответ

3

Вы не можете изменить, какую переменную ссылаются ссылки. Поэтому, если вы не можете инициализировать его в конструкторе, вам не нужна ссылка. Вы можете использовать обычный указатель, но, вероятно, лучше использовать какой-то умный указатель, соответствующий вашему конкретному использованию. Правильный ответ зависит прежде всего от того, как управляется время жизни управляемого объекта.

+0

Какой умный указатель вы предлагаете? – gliderkite

+0

Какова продолжительность жизни родительского объекта? Кто его разрушает? Когда он уничтожается? И что должно произойти с «ссылкой», когда объект уничтожается? (Короткий вариант вопроса: должен ли узел содержать своего родителя в живых? Или должен ли узел иметь какую-то «недопустимую ссылку», если родительский объект уничтожен?) –

+0

Корневой узел уничтожается только тогда, когда я решил его уничтожить, все дети также будут уничтожены. – gliderkite

2

Если вы хотите использовать ссылки, а не указатели, потому что вы хотите предположить, что экземпляр класса не владеет родительским узлом, вы можете использовать std::reference_wrapper из C++ 11's <functional>.

Я бы посоветовал использовать интеллектуальные указатели (за исключением, может быть, std::weak_ptr), если родительский объект содержит ссылки на дочерние элементы, а дочерние ссылки содержат ссылки на родителя. Использование интеллектуальных указателей в этом случае создаст циклическую зависимость, что означает, что ваши объекты никогда не будут уничтожены.

+0

Интересное обновление о циклической зависимости +1. – gliderkite

+0

Если у него типичное дерево, использование 'weak_ptr' не будет работать. Если узлы имеют только слабые указатели друг на друга, нет ничего, чтобы поддерживать узлы в живых. Вы можете использовать сильные указатели, причем само дерево содержит сильный указатель на корень, и каждый узел имеет сильные указатели на своих дочерних элементов. Когда это делается с узлом, вы должны отключить его дочерние указатели. В качестве альтернативы, дерево может содержать сильный указатель на каждый узел, который вы отключите, чтобы удалить узел из дерева. (Это достаточно уродливо, что мой совет такой же, как у вас, - не используйте для этого интеллектуальные указатели.) –

+0

@DavidSchwartz Вот что я имел в виду (я думал, это было очевидно). Только дети должны иметь слабые указатели на своих родителей, а родители должны владеть своими детьми. –

Смежные вопросы