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
의 인스턴스를 만들려면,하지만
B
는
A
의 전문성이며, 따라서 당신은 당신이 또한
A
합니다 (
A
기본 하위의 인스턴스를 생성합니다 B
의 인스턴스를 만들 때 -은
B
임).
즉, A
의 인스턴스를 만들려면 A
인스턴스를 간접적으로 만들어야합니다.
소리가 나지 않습니까?
A
(또는 B
)의 인스턴스를이 코드로 인스턴스화하면 무한 재귀 (예 : 대부분의 구현에서 이상한 오류)가 발생할 수 있습니다.
물론 컴파일이 완료되면 무한 루프가 발생합니다 ... –