2012-07-21 2 views
0

누락 된 기본 생성자 오류가 발생하여 복잡한 문제가 발생하여 많은 문제가 발생한 후에 동일한 오류가 발생했습니다. 오류. 이게 뭐가 잘못 됐어?기본 클래스에서 사용될 파생 클래스를 선언하면 누락 된 기본 생성자 오류가 발생합니다.

class B; 

class A 
{ 
public: 
    A() {instance = new B;} 
    virtual ~A() {delete instance;} 
private: 
    A*instance; 
}; 

class B : public A 
{ 
public: 
    B(){} 
} 

기본 클래스 내에서 사용할 파생 클래스를 전달할 수 없습니까?

+4

물론 컴파일이 완료되면 무한 루프가 발생합니다 ... –

답변

2

컴파일러가 B 클래스에 대해 아직 모르는 경우 new B이 성공할 수있는 방법은 무엇입니까? 당신이 클래스 B의 정의 아래 클래스 A에서 멤버 함수 구현을 이동하면, 그것을 작동합니다 : 정확히 어쨌든, A와 B 무엇

class A 
{ 
public: 
    A(); 
    virtual ~A(); 
private: 
    A * instance; 
}; 

class B : public A 
{ 
public: 
    B(){} 
}; 

A::A() 
{ 
    instance = new B; 
} 

A::~A() 
{ 
    delete instance; 
} 

입니까? 파생 클래스를 인스턴스화하면 기본 클래스가 약간 특이한 것입니다.

+0

아 맞습니다. 선언과 정의가 이와 같은 것을 피하기 위해 분리되어 있는지 반드시 확인하십시오. 감사! 내가 할 수있을 때 받아 들일 것인가 – FatalCatharsis

+0

Yeh, 나는 내가 묻게 될 것이라고 상상했다 : P. 클래스 A는 실제로 싱글 톤이며, 싱글 톤이 될 수있는 파생 클래스의 기본 클래스를 나타냅니다. 팩토리에서 파생 된 파생 클래스는 해당 문자열 인덱스의 파생 클래스를 카탈로그 화하고 인스턴스화 할 수 있습니다. 잘못된 문자열을 사용하여 싱글 톤을 시도하고 인스턴스화하면 getsingleton 함수에서 반환 된 참조가 아무 것도 가리 키지 않도록 기본이 필요하기 때문에 B가 필요합니다. 조금 복잡해 졌어. 그냥 내 자유 시간에 실험 해보는거야. P – FatalCatharsis

+0

... 일하는 것이면 컴파일시에 무한 루프를 만들 때 ... –

0

B의 정의 뒤에 A의 생성자 정의 (선언이 아니라)를 넣어야합니다. A에서 B를 사용하면 완료 할 필요가없는 한 괜찮습니다. - 및 new B 확실히 않습니다.

-1

아니요. 파생 클래스에는 추가 요소가 포함되어있을 수 있습니다. 그래서 파생 클래스 객체로 기본 클래스 객체를 초기화하는 데 사용할 수 없습니다. 컴파일러가 보이는 것입니다 방법 앞으로에 대한

0

C++ 규칙은 예를 들어이 멤버가 클래스의 뒷부분에 정의 된 경우에도 방법에 instance를 사용하는 괜찮습니다 (분명하지 않지만 그것은 나중에 정의 된 클래스를 사용하는 행위는 허용되지 않습니다 동일한 소스 파일). 이 경우

문제 (보고 된 기타로) new B를 컴파일 할 때 컴파일러는 그냥 클래스가있어보다 B에 대한 자세한 내용을 알고 있어야하며이 B 정말 무엇인지 찾기 위해 클래스 A 과거 읽는 유지할 것입니다.

class B; 

class A 
{ 
public: 
    A(); 
    virtual ~A(); 
private: 
    A *instance; 
}; 

class B : public A 
{ 
public: 
    B() {} 
}; 

inline A::A() { instance = new B; } 
inline A::~A() { delete instance; } 

이 컴파일하지만 실제로 당신이 무슨 말을 하려는지 때문에 제대로 실행되지 않습니다

한 가지 가능한 해결책은 (여전히 인라인을 떠나) 나중에 정의 A 생성자와 소멸자의을 넣어하는 것입니다 여기는 꽤 혼란 스럽습니다.

B의 인스턴스를 생성 할 A의 인스턴스를 만들려면,하지만 BA의 전문성이며, 따라서 당신은 당신이 또한 A합니다 ( A 기본 하위의 인스턴스를 생성합니다 B의 인스턴스를 만들 때 -B 임).

즉, A의 인스턴스를 만들려면 A 인스턴스를 간접적으로 만들어야합니다.

소리가 나지 않습니까?

A (또는 B)의 인스턴스를이 코드로 인스턴스화하면 무한 재귀 (예 : 대부분의 구현에서 이상한 오류)가 발생할 수 있습니다.

관련 문제