개체를 선언하기도 전에는 클래스를 만들
-
02-07-2019 - |
문제
어쨌든 선언하는 클래스의 객체전에 만들어진 C++?나 요구하기 때문에 사용하려 하는데 두 개의 클래스,첫 번째 요구하는 인스턴스의 두 번째 클래스 내에서 그것은,그러나 두 번째 클래스의 인스턴스를 포함 첫 번째 클래스입니다.나는 생각할 수 있습니다 내가로 얻을 수 있습니다 무한 루프로,하지만 실제로 만들 필요가 및 인스턴스의 두 번째 클래스하기 전에 첫 번째 클래스입니다.
해결책
할 수 없습니다 다음과 같은 것이 가능합니다.
class A {
B b;
};
class B {
A a;
};
가장 눈에 띄는 문제는 컴파일러는 방법을 알고하지 않을 큰 그것을 만들 필요가스 때문에 크기의 B 의 크기에 따라 달라집니다.
당신은 할 수 있습니다,그러나,이렇게:
class B; // this is a "forward declaration"
class A {
B *b;
};
class B {
A a;
};
을 선언하는 B 등급으로 앞으로 선언할 수 있습을 사용하여 포인터(참조)해당 클래스지 않고 아직 전체 클래스 정의합니다.
다른 팁
할 수 없습니다를 선언하의 인스턴스가 정의되지 않은 클래스를 선언할 수 있습니다 pointer 하나:
class A; // Declare that we have a class A without defining it yet.
class B
{
public:
A *itemA;
};
class A
{
public:
B *itemB;
};
가 우아한 솔루션 템플릿을 사용하여.
template< int T > class BaseTemplate {}; typedef BaseTemplate< 0 > A; typedef BaseTemplate< 1 > B; // A template<> class BaseTemplate< 0 > { public: BaseTemplate() {} // A constructor B getB(); } // B template<> class BaseTemplate< 1 > { public: BaseTemplate() {} // B constructor A getA(); } inline B A::getB() { return A(); } inline A B::getA() { return B(); }
이 코드는 것입니다.그래서,그것은 왜 작동합니까?그 이유는 방법 템플릿은 컴파일합니다.템플릿 지연의 생성 기능 서명될 때까지 당신이 실제로 사용 템플릿이 어딘가에.즉 도 getA()도 getB(됩니다) 그들의 서명을 분석한 후까지 모두 클래스 A B 이 완 선언했다.그의 마술 이 방법입니다.
이것이 가까운 당신이 원하는 무엇:첫 번째 클래스가 포함되어 두 번째 클래스,하지만 두 번째 클래스(는 처음 만들어진)에 대한 참조가 있는 첫 번째 클래스?
이라고 합니다.보 기 예입니다.