c++ - 前向声明和命名空间 (c++)

标签 c++ namespaces forward-declaration

我的问题:

有两个类(class),A 类和 B 类,所以我有 A.h 和 A.cpp 以及 B.h 和 B.cpp。 A 需要知道 B,B 需要知道 A。我通过以下方式解决了它(我不知道为什么必须这样......)

啊哈:

#include "B.h"
class A{ ... 

A.cpp:

#include "A.h"

B.h:

#include "A.h"
class A; // forward declaration
class B { ... 

B.cpp:

#include "B.h"

我使用了一个前向声明并且它有效。

问题是,这两个类都需要在命名空间“ui”中。或者至少我认为是这个意思:

啊哈:

#include "B.h"
namespace ui{
  class A;
}

class A{ ... 

B.h:

#include "A.h"
namespace ui{
  class B;
}

class B{ ... 

这不再起作用了。我现在需要做什么才能让它再次使用命名空间和前向声明?

两者都必须在此命名空间中。我正在使用 Qt 并且需要 "namespace ui{"等行。两个类(class)都需要相互了解。 我已经尝试过这样做:

namespace ui{
 class A;
 class B;
}

在两个标题中,但这不起作用...

顺便说一句:所有头文件也都有“ifndef”机制。

最佳答案

如果我没听错的话,你用这样的结构声明了 2 种不同的类型:

#include "B.h"
namespace ui{
  class A;
}

class A{ ... }; 

这里你声明在命名空间ui中有一个class A,但是你在全局命名空间中定义了一个class A。因此 ui::A 被声明但 从未 被定义。将 A 的定义也移动到 ui 命名空间:

#include "B.h"
namespace ui{
  class A;
}

//somewhere later:
namespace ui
{
  class A{ ... };
}

关于c++ - 前向声明和命名空间 (c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6445330/

相关文章:

c++ - C++ 中的 glutIdleFunc() 变量值未递增

循环/结构中的 C++ 函数

c++ - 我可以使用 C++03 标准库功能模拟一个空的 lambda 吗?

php - 如何在 php 中取消设置命名空间以访问全局类

c++ - C++ 中交叉依赖类的最佳实践

c++ - 设置 sfml

c++ - 在不包含原始声明的命名空间中重新声明

python - django 身份验证 URL 的默认命名空间是什么?

clojure - `def` vs `declare` 用于前向声明

c++ - 如何转发声明从另一个类C++继承的类?