2012-12-20 10 views
2

상위 중첩 클래스에서 생성자를 사용하여 상속 한 중첩 클래스의 생성자를 만들려고합니다. 기본적으로 :C++ 함수 매개 변수의 기본 클래스 포인터 포인터에 대한 캐스팅

BaseList<T>::BaseNested::BaseNested(BaseNode*& ptr) 

를 (그리고 그것의 코드에서 말했다 포인터의 주소를 필요로하기 때문에 참조에 의한 PTR 매개 변수를 얻기 위해 필요합니다

DerivedList<T>::DerivedNested::DerivedNested(DerivedNode*& ptr) 
    : BaseList<T>::BaseNested::BaseNested(ptr) 
{} 

내 BaseNested의 생성자의 프로토 타입은 다음과 같이 간다)

필자는 DerivedNode *를 BaseNode *로 캐스트해야한다고 생각했지만 static_cast :: BaseNode *> (ptr)은 참조가 아니므로 일치하는 함수를 찾지 않으며 static_cast :: BaseNode * &> (ptr) 잘못된 캐스트 오류가 발생합니다.

dynamic_cast도 마찬가지입니다. reinterpret_cast는 컴파일되지만 실행 중에 잘못된 결과를줍니다.

누구나 그 부모 생성자를 호출 할 수있는 방법을 알고 있습니까?

+1

'DerivedNode * &'유형 중 하나와 'BaseNode * &'유형 중 하나는 동일한 포인터를 참조하는 두 개의 참조를 가질 수 없습니다. 포인터 - 투 - 포인터와 참조 - 투 - 포인터는 다형성과 함께 잘 작동하지 않습니다. 다형성 행동을 원한다면, 이런 일을 피하십시오. –

답변

4

참조가 필요할 것으로 생각되면 나중에 포인터를 수정해야 할 수 있습니다. 문제는 파생 클래스의 포인터 형식이 기본 클래스의 DerivedNode*BaseNode*입니다. 기본 클래스가 포인터에 DerivedNode2*에 영향을 주면 어떻게 될까요?

setters를 사용하거나 논리를 기본 클래스에서 파생 클래스로 옮겨야합니다.

+0

BaseNested는 BaseNode (BaseNode **)에 대한 포인터에 대한 포인터 인 특성을 가져야하므로 참조가 필요합니다. 그 BaseNested는 하나의 간접 참조를 제외하면 반복자처럼 작동해야하는데, 이는 특정 포인터의 주소가 필요한 이유입니다. 그리고 나는 ... 당신이 "논리를 움직여"라는 말이 무슨 뜻인지 확신 할 수 없습니까? – user1918737

+0

"논리 이동"= 파생 클래스에서이 포인터를 사용하는 코드를 이동합니다. 아마 네가 할 수있는 최선이야. 또는 포인터를 포인터로 사용하고 참조가 없습니다 (그러나 매우 신중해야합니다). – Synxis

+0

그 덕분에 많이 일했습니다! – user1918737

관련 문제