문제

어쨌든 선언하는 클래스의 객체전에 만들어진 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 이 완 선언했다.그의 마술 이 방법입니다.

이것이 가까운 당신이 원하는 무엇:첫 번째 클래스가 포함되어 두 번째 클래스,하지만 두 번째 클래스(는 처음 만들어진)에 대한 참조가 있는 첫 번째 클래스?

이라고 합니다.보 예입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top