2014-11-25 4 views
1

У меня есть следующая структура классов. Это, очевидно, не будет компилироваться. Я могу переслать объявление B. Тогда я могу либо использовать указатели функций в вызовах функций, но это не очень хорошее решение, так как я бы назвал другие функции в A из A :: funcA или поместил часть объявления B в заголовок, который будет состоять из нескольких сотен линий и будет практичным.C++ 03 Разрешить композицию круга при вызове функции-члена

Что (иначе) было бы предпочтительным способом справиться с этой ситуацией?

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(); 
} 

У меня есть следующие (опуская некоторые линии) ненужным:

Ах

Class B; 

Class A { 
    declaration of A 
}; 

a.cpp ....

Bh

#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

Вы * do * include '" B.h "' в 'BBase.cpp'? –

+0

Нет, в 'cpp'-s включен только соответствующий' .h'. например 'BBase.cpp' имеет только« BBase.h ». – CreMinES

+0

* Где * вы получаете ошибку? Если вы используете 'B', вам нужно полное определение класса' B', и поэтому вам нужно включить файл 'B.h' в этот исходный файл. –

ответ

1

Предполагая E и C адекватно объявлены/определены, то, что у вас есть почти отлично. Проблема в том, что вы определяете функцию-член от A, прежде чем у вас есть определение класса B, убедитесь, что класс B полностью определен (фактический класс, а не полная реализация его функций-членов), прежде чем у вас есть член A функции реализованы.

Так что-то вроде этого:

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{ 
}; 

и передать IB вместо B к A.

либо еще лучше в C++ использовать функцию шаблона и связать свою функцию-член, которую вы хотите назвать

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

Я не могу использовать C++ 11, к сожалению (bind). – CreMinES

+0

В настоящее время рассматривается реализация интерфейса и использование множественного наследования ... – CreMinES

+0

вы можете использовать boost :: bind вместо этого. – AlexTheo