我有两个类,它们都使用其他一些类,例如:
// class1.h
class Class1;
#include "class2.h"
class Class1 {
public:
static Class2 *C2;
...
};
// class2.h
class Class2;
#include "class1.h"
class Class2 {
public:
static Class1 *C1;
...
};
当我像上面的示例中那样定义它时,它可以工作(我还有一些#ifndef
以避免无限的头部复原)。但我也想在我的类中添加一些内联函数。我读here我应该在头文件中定义内联函数,因为如果我将它们放在cpp文件中并想从其他cpp文件中调用它们将无法工作(当我这样做时我在链接期间获取未定义的引用)。但这里的问题是这样的:
// class1.h
...
inline void Class1::Foo() {
C2->Bar();
}
我收到错误:无效使用不完整类型'struct Class2'。
那我该怎么做呢?
答案 0 :(得分:8)
您需要延迟包含标题,但随后包含它并定义您的内联方法。通过在每个头中执行此操作,它们是自给自足的,并且包括一个将始终包含另一个,include guards阻止无限递归。
#ifndef INCLUDE_GUARD_B9392DB18D114C1B8DFFF9B6052DBDBD
#define INCLUDE_GUARD_B9392DB18D114C1B8DFFF9B6052DBDBD
struct B;
struct A {
B* p;
void foo();
};
#include "B.hpp"
inline
void A::foo() {
if (p) p->bar();
}
#endif
#ifndef INCLUDE_GUARD_C81A5FEA876A4C6B953D1EB7A88A27C8
#define INCLUDE_GUARD_C81A5FEA876A4C6B953D1EB7A88A27C8
struct A;
struct B {
A* p;
void bar();
};
#include "A.hpp"
inline
void B::bar() {
if (p) p->foo();
}
#endif
答案 1 :(得分:2)
你混淆了它。你想要的是:
// class1.h
class Class2;
class Class1 {
public:
static Class2 *C2;
...
};
// class2.h
class Class1;
class Class2 {
public:
static Class1 *C1;
...
};
并在源代码中包含相应的标头。这一行:
class Class1; // or Class2
声明不完整类型,您可以拥有指向不完整类型的指针和引用。但是,在使用时,它需要完整。所以只要说“嘿它就会存在!”在标题中,在源代码中告诉它它是什么。
答案 2 :(得分:0)
我的建议是将公共方法和成员放在基类中,然后从基类派生C1和C2。这可能会解决循环依赖问题。