-
19-09-2019 - |
题
我有两个类和它们两者使用了一些其它类的,关于示例:
// 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;
...
};
和当我例如定义它像上面,它的工作原理(I也有一些#ifndef
避免无限头recurency)。但我也想了一些内联函数添加到我的班。我读这里,我应该把内联函数的定义在头文件,因为如果我把它们放在CPP文件,并希望从其他CPP文件中称他们将无法正常工作(当我这样做,我在连接过程中得到了一个未定义参考)。但这里的问题是这样的:
// class1.h
...
inline void Class1::Foo() {
C2->Bar();
}
我得到错误:无效使用不完整的类型的“结构的Class2”
所以,我该怎么办呢?
解决方案
您需要延迟包括头部,但随后包括它和定义内联方法。通过在每个标题这样做,他们是自给自足,包括一个总是包括其他的,与包括警卫防止无限递归。
A.hpp
#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
B.hpp
#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
其他提示
您有它mix'd起来。你想要的是:
// class1.h
class Class2;
class Class1 {
public:
static Class2 *C2;
...
};
// class2.h
class Class1;
class Class2 {
public:
static Class1 *C1;
...
};
和包括在源极的各自标题。行:
class Class1; // or Class2
声明一个不完全型,并且可以具有指针和引用不完全类型。实际使用情况,但是,它需要完成。所以,只是说:“嘿,它会存在!”在报头中,并且在源告诉它是什么。
我的建议是放置常用的方法和成员为基类,然后从基类派生C1和C2。这可以解决循环依赖问题。
不隶属于 StackOverflow