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

Obs*_*Obs 13 c++ namespaces forward-declaration

我的问题:

有两个班,A班和B班,所以我得到了Ah和A.cpp以及Bh和B.cpp.需要知道B和B需要知道A.我用以下方式解决了它(我不知道为什么它必须如此......)

啊:

#include "B.h"
class A{ ... 
Run Code Online (Sandbox Code Playgroud)

A.cpp:

#include "A.h"
Run Code Online (Sandbox Code Playgroud)

BH:

#include "A.h"
class A; // forward declaration
class B { ... 
Run Code Online (Sandbox Code Playgroud)

B.cpp:

#include "B.h"
Run Code Online (Sandbox Code Playgroud)

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

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

啊:

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

class A{ ... 
Run Code Online (Sandbox Code Playgroud)

BH:

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

class B{ ... 
Run Code Online (Sandbox Code Playgroud)

这不再起作用了.现在我需要做些什么来使命名空间和前向声明再次起作用?

两者都必须在此命名空间中.我正在使用Qt,需要使用"namespace ui {"等行.两个班级都需要相互了解.我已经尝试过这样做:

namespace ui{
 class A;
 class B;
}
Run Code Online (Sandbox Code Playgroud)

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

顺便说一句:所有Header-Files也获得了"ifndef"机制.

ova*_*nes 13

如果我理解你,你用这样的结构声明了两种不同的类型:

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

class A{ ... }; 
Run Code Online (Sandbox Code Playgroud)

在这里,您声明class A命名空间中有一个ui,但您class A在全局命名空间中定义了一个.因此ui::A声明,但从来没有定义.将定义移动Aui命名空间:

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

//somewhere later:
namespace ui
{
  class A{ ... };
}
Run Code Online (Sandbox Code Playgroud)


Jör*_*son 7

// A.h
namespace ui {
   class A; // forward
   class B {
   };
}



// B.h
namespace ui {
   class B; // forward
   class A {
   };
}



// A.cpp
#include "A.h"
#include "B.h"



// B.cpp
#include "A.h"
#include "B.h"
Run Code Online (Sandbox Code Playgroud)