업데이트 :이 예에서 shared_ptr는 Boost의 것과 비슷하지만 shared_polymorphic_downcast (또는 해당 문제의 경우 dynamic_pointer_cast 또는 static_pointer_cast)를 지원하지 않습니다!다운 캐스팅 shared_ptr <Base> to shared_ptr <Derived>?
나는 참조 카운트를 잃지 않고 파생 클래스에 공유 포인터를 초기화하기 위해 노력하고있어 :
struct Base { };
struct Derived : public Base { };
shared_ptr<Base> base(new Base());
shared_ptr<Derived> derived;
// error: invalid conversion from 'Base* const' to 'Derived*'
derived = base;
를 지금까지 너무 좋아. C++에서 Base *를 암시 적으로 Derived *로 변환 할 것을 기대하지 않았습니다. 그러나, 나는 코드에 의해 표현 된 기능을 원한다. (즉, 기본 포인터를 내리는 동안 참조 카운트를 유지해야한다.) 내 첫번째 생각은 일어날 수있는 파생에 대한 암시 적 변환 있도록 자료의 캐스트 연산자를 제공하는 것이 었습니다 (의 pedants을 위해 : 나는 아래 캐스트가 유효한지 확인할 것, 걱정하지 마세요) :
struct Base {
operator Derived*();
}
// ...
Base::operator Derived*() {
return down_cast<Derived*>(this);
}
음, 도움이되지 않았다. 컴파일러는 내 typecast 연산자를 완전히 무시한 것 같습니다. shared_ptr 할당을 어떻게 할 수 있습니까? 추가 포인트 : Base* const
은 어떤 종류입니까? const Base*
나는 이해하지만, Base* const
? 이 경우 const
은 무엇을 말합니까?
shared_ptr 대신 shared_ptr 이 필요한 이유는 무엇입니까? –
Bill
객체를 복제하지 않고 기본에없는 파생 된 기능에 액세스하려고하므로 (두 개의 공유 포인터로 참조되는 단일 객체가 필요함). 그건 그렇고, 캐스팅 오퍼레이터는 왜 작동하지 않습니까? –