在C++中处理共同依赖类的最佳方法是什么?

Nat*_*man 10 c++ header

假设我有一个类foo,类bar的对象作为成员

class foo
{
    bar m_bar;
};
Run Code Online (Sandbox Code Playgroud)

现在假设酒吧需​​要跟踪拥有它的foo

class bar
{
    foo * m_pfoo;
}
Run Code Online (Sandbox Code Playgroud)

这两个类相互引用,没有前向声明,不会编译.因此,在foo声明之前添加此行可以解决该问题

class bar;
Run Code Online (Sandbox Code Playgroud)

现在,问题是 - 在编写头文件时,每个头都依赖于另一个:foo.h需要bar.h中的定义,反之亦然.处理这个问题的正确方法是什么?

Ree*_*sey 24

您需要将所有成员访问权限从标题中移出,并放入源文件中.

这样,您可以在标头中转发声明类,并在foo中定义它们:

// foo.h
class bar;

class foo {
    bar * m_pbar;
}

// bar.h
class foo;
class bar {
    foo * parent;
}
Run Code Online (Sandbox Code Playgroud)

这将允许您工作 - 您只是不能将需要成员信息的定义放入标题 - 将其移动到.cpp文件..cpp文件可以包含foo.h和bar.h:

// Foo.cpp
#include "foo.h"
#Include "bar.h"

void foo::some_method() {
     this->m_pbar->do_something(); // Legal, now, since both headers have been included
}
Run Code Online (Sandbox Code Playgroud)

  • 现在,如果你的代码依赖类是模板化的,那么这个解决方案是如何工作的,所以不能分成header和cpp文件? (2认同)