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声明,但从来没有定义.将定义移动A到ui命名空间:
#include "B.h"
namespace ui{
class A;
}
//somewhere later:
namespace ui
{
class A{ ... };
}
Run Code Online (Sandbox Code Playgroud)
// 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)