2011-06-22 133 views
12

我的问题:向前声明和命名空间(C++)

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

啊:

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

A. CPP:

#include "A.h" 

了Bh:

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

B.cpp:

#include "B.h" 

我使用了一个前向声明,它的工作原理。

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

A.H:

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

class A{ ... 

B.h:

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

class B{ ... 

这不工作了。我现在必须做些什么才能使它再次与名称空间和前向声明一起工作?

两者都必须位于此名称空间中。我正在使用Qt,并且需要使用“namespace ui {”等。两个班都需要彼此了解。 我已经尝试只是为了让这样的:

namespace ui{ 
class A; 
class B; 
} 
两个头

,但这并不工作...

BTW:所有页眉文件也得到了“IFNDEF” -mechanism。

+3

什么是“这不起作用了吗?”是什么意思?请发布确切的编译器/链接器错误 – fredoverflow

回答

6
// 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" 
3

你快到了。这应该工作:

// A.h 
namespace ui { 

class B; 
class A { 
    ... 
}; 

} // namespace ui 

// B.h 
namespace ui { 

class A; 
class B { 
    ... 
}; 

} // namespace ui 

你有错的唯一的事情是,你必须要定义命名空间中的类;在命名空间内转发声明是不够的。

+0

我无法做到这是自动生成的文本由QT-设计师。它只是做到了这一点。我不知道为什么。顺便说一句,在我的第一个例子中,我声明为工作,我还需要两个前向声明 – Obs

+0

您可能已经注意到,你有三个答案都说几乎完全一样的东西?如果QT-Designer不能被说服把它的类定义放到“'namespace ui {'...'}'”块中,那么你就会被这些类所困全局命名空间。 – zwol

13

如果我理解你的权利,你声明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{ ... }; 
} 
0

这是一个非常Qt的具体问题。

当Qt Designer为您自动生成代码文件时,Ui命名空间是与您的类不同的命名空间。实际上在这里声明了两个不同的类:全局名称空间中的class A,以及Ui名称空间中的class Ui::A。第二个类包含Qt为您生成的所有控件(当您使用表单设计器时),并且第一个类(在全局名称空间中)具有您的所有逻辑。

Qt Creator中的版本我用(3.1)也将产生class A(不Ui::A)的私有成员:private: Ui::A* ui;,这是建立与ui->setUp(this)。然后您可以访问控件(例如ui->lineEdit->toPlainText();