Я пытаюсь скомпилировать что-то вроде следующего:
хиджры
#include "B.h"class A {
B * b;
void oneMethod();
void otherMethod();
};
a.cpp
#include "A.h"void A::oneMethod() { b->otherMethod() }
void A::otherMethod() {}
B.h
#include "A.h"class B {
A * a;
void oneMethod();
void otherMethod();
};
B.cpp
#include "B.h"void B::oneMethod() { a->otherMethod() }
void B::otherMethod() {}
До сих пор у меня не было проблем с использованием предварительных объявлений, но я могу использовать это сейчас, потому что я не могу использовать atributtes или методы только для объявленных вперед классов.
Как я могу решить это?
Пока я правильно понимаю ваш вопрос, все, что вам нужно сделать, это:
хиджры
class B;// Forward declaration, the header only needs to know that B exists
class A {
B * b;
void oneMethod();
void otherMethod();
};
a.cpp
#include "A.h"#include "B.h"//Include in the .cpp since it is only compiled once, thus avoiding circular dependency
void A::oneMethod() { b->otherMethod() }
void A::otherMethod() {}
B.h
class A;// Forward declaration, the header only needs to know that A exists
class B {
A * a;
void oneMethod();
void otherMethod();
};
B.cpp
#include "B.h"#include "A.h"//Include in the .cpp since it is only compiled once, thus avoiding circular dependency
void B::oneMethod() { a->otherMethod() }
void B::otherMethod() {}
В C ++, в отличие от Java и C #, вы можете определить функцию-член (предоставляя ее тело) вне класса.
class A;
class B;
class A {
B * b;
void oneMethod();
void otherMethod() {}
};
class B {
A * a;
void oneMethod();
void otherMethod() {}
};
inline void A::oneMethod() { b->otherMethod(); }
inline void B::oneMethod() { a->otherMethod(); }
Вы должны отложить использование членов класса до тех пор, пока этот класс не будет определен. В вашем случае это означает перемещение некоторых тел функций-членов в конец файла:
class B;
class A {
B * b;
void oneMethod();
void otherMethod() {}
};
class B {
A * a;
void oneMethod() { a->otherMethod() }
void otherMethod() {}
};
inline void A::oneMethod() { b->otherMethod() }
Вот типичное решение в нескольких файлах:
хиджры
class B;
class A {
B * b;
void oneMethod();
void otherMethod();
};
B.h
class A;
class B {
A * a;
void oneMethod();
void otherMethod();
};
a.cpp
#include "A.h"#include "B.h"
void A::oneMethod() { b->otherMethod() }
void A::otherMethod() {}
B.cpp
#include "A.h"#include "B.h"
void B::oneMethod() { a->otherMethod() }
void B::otherMethod() {}
main.cpp
#include "A.h"int main () { A a; a.oneMethod(); }
Поместите реализацию ваших функций в файлы cpp, и тогда cpp может включать оба заголовка.