У меня есть следующая структура классов. Это, очевидно, не будет компилироваться. Я могу переслать объявление 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».
Вы * do * include '" B.h "' в 'BBase.cpp'? –
Нет, в 'cpp'-s включен только соответствующий' .h'. например 'BBase.cpp' имеет только« BBase.h ». – CreMinES
* Где * вы получаете ошибку? Если вы используете 'B', вам нужно полное определение класса' B', и поэтому вам нужно включить файл 'B.h' в этот исходный файл. –