2014-11-25 8 views
1

다음 클래스 구조가 있습니다. 이것은 분명히 컴파일되지 않습니다. 나는 B를 선언 할 수있다. 그렇다면 함수 호출에서 함수 포인터를 사용할 수도 있지만 좋은 해결책은 아니다. A에서 funcA에서 다른 함수를 호출하거나 B의 선언 부분을 헤더에 넣으면된다. 이것은 몇 백 줄의 것이 어 실용적이다.C++ 03 멤버 함수를 호출 할 때 원 구성을 확인하십시오.

이 상황을 처리하기 위해 선호되는 방법은 무엇입니까?

Class B; 

Class A { 
    declaration of A 
}; 

A.cpp ....

BH

:
class B; 

class A 
{ 
public: 
    void funcA(B* b); 
    double funcA2(); 
    int funcA4(B* b); 

private: 
    E memberA1; 
    E memberA2; 
}; 

void A::funcA(B* b) { 
    b->funcB(a->memberA1, a->memberA2); 

class B : public BBase 
{ 
public: 
    void FuncB(E* e1, E* e2) 
    { 
     /* using const objects of B that are initialized 
      by B() and some other functions... */ 
    } 

    std::vector<C*> memberB1;    // C has std::vector<A*> memberC1 
}; 

int main() { 
    calling B->memberB1.at(0)->memberC1.at(0)->funcA(); 
} 

나는 다음 (생략 일부 unneccesary 라인)가 ,
#include "A.h" 
#include "BBase.h" 

Class B { 
    declaration of B 
}; 

B.cpp ....

BBase.h

#include "C.h" 
#include "A.h" 
#include "AInterface.h" 

typedef std::vector<AInterface> AList; 

BBase { 
    declaration of abstract BBase 
}; 

BBase.cpp ....`

하지만 여전히 오류가 발생합니다 : 불완전한 유형 'B'에 대한 회원 액세스.

+0

"BBase.cpp"에''B.h "'가 포함되어 있습니까? –

+0

아니요,'cpp'-s에는 오직 대응하는'.h' 만 포함되어 있습니다. 예 : 'BBase.cpp'는'BBase.h' 만 가지고 있습니다. – CreMinES

+0

* 어디에서 * 오류가 있습니까? 'B'를 사용한다면'B' 클래스의 완전한 정의가 필요하므로'B.h' 파일을 그 소스 파일에 포함시켜야합니다. –

답변

1

EC이 적절히 선언/정의되었다고 가정하면, 사용자가 가지고있는 것은 거의입니다. 문제는 사용자가 B 클래스의 정의를 갖기 전에 A의 멤버 함수를 정의한다는 것입니다. A 멤버가 있기 전에 B 클래스가 완전히 정의되어 있는지 (멤버 함수의 전체 구현이 아닌 실제 클래스가 있는지) 확인하십시오. 구현 된 기능.

그래서 이런 식으로 뭔가 :

class B; 

class A { ...; void member_function(B*); ... }; 

class B { ...; void other_member_function(); ... }; 

void A::member_function(B* b) { ...; b->other_member_function(); ... } 
+0

헤더를 포함하도록 내 질문을 업데이트했습니다. – CreMinES

0
내가 사용 중 인터페이스를 대신 콘크리트 B 클래스의

class B : public IB{ 
}; 

중 하나 A. 대신 B의 IB를 전달하는 제안

심지어 더 나은 C + +에서 템플릿 함수를 사용하고 당신이 전화하고자하는 회원 함수를 바인딩

a.funcA(std::bind(&B::funcB, &b, someArg); 
+0

유감스럽게도 (bind) C++ 11을 사용할 수 없습니다. – CreMinES

+0

현재 인터페이스 구현 및 다중 상속 사용 검사 중 ... – CreMinES

+0

대신 boost :: bind를 사용할 수 있습니다. – AlexTheo