两个类和内联函数

时间:2010-02-09 22:55:23

标签: c++ class inline forward-declaration circular-dependency

我有两个类,它们都使用其他一些类,例如:

// 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'。

那我该怎么做呢?

3 个答案:

答案 0 :(得分:8)

您需要延迟包含标题,但随后包含它并定义您的内联方法。通过在每个头中执行此操作,它们是自给自足的,并且包括一个将始终包含另一个,include guards阻止无限递归。

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

答案 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。这可能会解决循环依赖问题。