2012-07-01 2 views
1

나는 클래스가초기화 참조

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

클래스 인스턴스가 부모 노드를 소유하지 않도록 제안하기 때문에 포인터가 아닌 참조를 사용하려면 C++ 11의 <functional>에있는 std::reference_wrapper을 사용할 수 있습니다.

부모가 자식에 대한 참조를 보유하고 자식이 부모에 대한 참조를 보유하는 경우 스마트 포인터 (어쩌면 std::weak_ptr 제외)를 사용하지 않는 것이 좋습니다. 이 경우 스마트 포인터를 사용하면 주기적 종속성이 생겨 개체가 파괴되지 않습니다.

+0

순환 의존성 +1에 대한 흥미로운 업데이 트. – gliderkite

+0

그가 전형적인 트리를 가지고 있다면,'weak_ptr'을 사용하면 작동하지 않습니다. 노드가 서로 약한 포인터 만 있으면 노드를 활성 상태로 유지할 수 없습니다. 강력한 포인터를 사용할 수 있습니다. 트리 자체에는 루트에 대한 강력한 포인터가 있고 각 노드에는 자식에 대한 강력한 포인터가 있습니다. 노드에서 작업을 마쳤 으면 자식 포인터를 끊어야합니다. 또는 트리 자체가 모든 노드에 대한 강력한 포인터를 유지할 수 있습니다.이 포인터는 트리에서 노드를 제거하기 위해 연결을 끊습니다. (이것은 나의 충고가 당신과 똑같은 정도로 충분히 추한 것이다. 이것을 위해 스마트 포인터를 사용하지 말아라.) –

+0

@DavidSchwartz 그것이 내가 의미하는 바였다 (나는 분명했다). 아이들 만이 부모에게 약한 정보를 전달해야하며 부모는 자녀를 소유해야합니다. –

관련 문제