2010-08-17 8 views
3

이것은 이상하게 보일지 모르지만, 클래스 B의 변수가 필요하고 클래스 B가 클래스 A의 포인터를 필요로하므로 내 프로그램에서 문제가 발생하여 어느 클래스가 어떤 것에 첨부되어 있는지 ...클래스 B의 클래스 A의 변수와 클래스 A의 클래스 B의 포인터는?

클래스 A에서 클래스 B가 아직 정의되지 않았으며 클래스 B에서 클래스 A가 아직 정의되지 않았기 때문에 오류가 발생합니다 ...

별도의 클래스를 포함하는 내 헤더 파일은 서로를 포함하며 앞으로 클래스를 선언하려고했습니다. 예를 들어 클래스 A; 클래스 B; 하지만 난 같은 컴파일러 오류가 발생합니다 :

error C2079: 'CFrame::menu' uses undefined class 'CMenu' 

나중에 다른 클래스에 전달하고 싶기 때문에 클래스 B의 클래스 A에 대한 포인터가 필요합니다.

class A; // declaration of A 

class B // definition of B 
{ 
    A* foo; 
    // ... 
}; 

class A // definition of A 
{ 
    B bar; 
    // ... 
}; 

선언의 이런 종류의

자주 앞으로 선언라고 : 당신이 B을 정의하기 전에

+0

표현하기 어려운 것은 일반적으로 이해하기가 더 어렵습니다. 네, 앞으로 선언이 무엇인지 알았으니, 그리 어렵지는 않습니다.하지만 8 분 전에는 그때 당신에게 "불가능"했습니다. – msw

답변

6

당신은 A를 선언해야합니다.

+1

요점은 A에 포인터가 아니라 B ​​유형의 인스턴스 변수가 포함되어 있기 때문에 A에 대한 것이 아니라 B에 대한 순방향 선언 만 사용한다는 것입니다. –

+0

아, 예, 여기에 큰 혼란이 있습니다. 저는 실제로 이것을 시작했습니다. 그러나 저는 제 "안전 가드"를 깨닫습니다. #ifndef CMENU_INCLUDED # CMENU_INCLUDED를 정의하면 엉망이되어 버렸다. 그래서 나는 그 전에 하나의 헤더를 포함 시켰고, 앞으로 선언 한 것만으로 이제는 작동한다! 감사합니다 – Kaije

+0

그것은 3.9.2/3에 의존합니다 - "불완전한 유형에 대한 포인터는 허용됩니다. 그러나 그들과 함께 할 수있는 것에 대한 제한이 있습니다 (3.9).". 따라서 B가 해당 지점에서 불완전하더라도 B에 대한 포인터를 갖는 것이 합법적입니다 – Chubsdad

2

우선, 수업을 다시 디자인 해보십시오. 순환 의존성은 나쁜 습관이며, 좀 더 우아한 수업 설계로이 모든 것을 피할 수있는 가능성이 있습니다. 당신은 단순히 무엇을 지정하여 선언을 앞으로 방지 할 수 있습니다

class B; 

class A 
{ 
    B *pPtr; 
}; 

class B 
{ 
    A typeA; 
}; 
0

- 말했다

, 당신은 (이 시점에서, 당신은 포인터 또는 참조를 사용할 필요가) 앞으로 참조를 사용하여 문제를 해결 얻을 수 있습니다 "B"는 다음과 같습니다.

class A 
{ 
public: 
    class B* pB; 
}; 

class B 
{ 
public: 
    A a; 
}; 

문제가있는 경우 신고서와 함께 구현을 포함하고 있기 때문일 수 있습니다. 구현과 헤더를 분리하면이 시나리오에서 문제가 줄어들 수 있습니다.

관련 문제