2013-06-18 6 views
0

어떤 이유로 든 개인 생성자를 호출하는 정적 메서드로 만들어진 개체가 있습니다. (싱글 톤이 아닙니다.)C++에서 제대로 다운 캐스트하는 방법

더 많은 멤버와 기능을 가진 첫 번째 오브젝트에서 새 오브젝트를 파생 시키려고합니다.
정적 메서드가 firstObject* 개체를 반환하기 때문에 문제가 발생하므로 secondObject*의 다운 캐스팅을 사용하여 생성하면 메모리가 오버플로됩니다.

어떻게해야합니까? 첫 번째 객체의 코드에 액세스 할 수 있지만 생성자를 변경하는 것은 불가능합니다 (변경하면 큰 코드를 변경해야합니다).

편집 : 모든 조치에

감사합니다. 보호 될 생성자를 변경할 수 있습니다.

+0

게시 코드는 설명하는 것보다 낫습니다. 나는 당신의 질문에서 그 문제를 해결할 수 없다. – Angew

+1

private 생성자를 표시하면 실제로 많은 코드가 다시 작성되어야합니다. 그런 다음 정상적인 방식으로 클래스를 파생시킵니다. – Bathsheba

+0

보호 된 ctor를 클래스에 추가 할 수 있습니까? 다음과 같이 할 수 있습니다. 1. 가능한 경우 C++ 11 위임 생성자를 사용합니다. 또는 가능하다면 개인 ctor의 기능을 함수에 추출하십시오. – Angew

답변

5

생성자가 적어도 protected인지 확인하여 하위 클래스에서 사용할 수 있도록하십시오. 당신은 메모리 오버 플로우하지만 이것에 대해 두려워 무엇인지 확실하지

:

class Base { 
public: 
    static Base* getInstance(); 
    virtual ~Base() {}; 
protected: 
    Base() {}; 
}; 

class Derived : public Base {}; 

// Implementation 
Base* Base::getInstance() { return new Derived(); } 

int main() { 
Base::getInstance(); 
}; 

작품 perfectly.

이제는 그 상황에서 원시 포인터를 반환하지 말 것을 권합니다. (std::unique_ptr이 더 나을 것입니다.)하지만 그것은 아마도 오프 주제입니다.

+0

그럴 수 없습니다 : 기본 생성자가 비공개입니다. 기본 생성자가 public이면 OK가 될 것입니다. 우리는 코드를 볼 필요가있다. – Bathsheba

+0

@Bathsheba : 좋은 캐치. 결정된. – ereOn

+0

@ereOn; 당신은 그 컴파일을 확신합니까? 파생 된을 만들 수 없습니다. – Bathsheba