我有两个类和它们两者使用了一些其它类的,关于示例:

// 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。这可以解决循环依赖问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top