2012-05-31 44 views
0

我有一组类来实现,我打算做下列方式:堆叠多个前置声明

(1)的主头文件(entity.h),有这些类封装在命名空间即的所有前向声明:

namespace SomeNameSpace { 
    class A; 
    ... 
    class E; 
} 

(2)每一类然后有单独的头文件(即AH,BH),它定义的类,并声明所有构成变量和方法。

(3)最后,定义了所有成员和静态的.cpp(即A.cpp,B.cpp)。

现在,我试图通过做#include "entity.h"来实现这个方案,但是当我尝试使用这些类中的一个时,我被打上了一个“模棱两可”的错误。如果我跳过步骤(1)并简单地包括每个类的所有个人头文件,那么我就没有这个问题(这就是我一直在编写代码的方式)。

那么无论如何,我的方案是否可行?有什么方法可以使它工作吗?我真正想要的是有某种方式将每个自定义对象放在一个名称空间中。我想我可以通过简单地将所有的类声明放入一个文件来完成这项工作,但这会让entity.h变得臃肿。

我已经用关键字“forward declaration”,“C++”,“namespace”,“one namespace”,“master header”,“header”进行了搜索,并且找不到任何相关的东西。也许我想要做的是错的?

回答

2

您不能使用“A级”在你的entity.h中,因为这意味着你实际上声明了一个类,但是你已经在Ah中这样做了。 你可以在entity.h中添加整个声明,但不能使用任何Ah,Bh等。 或者,你可以只要使用相同的命名空间中的每个* .h文件中: 啊 - > 命名空间SomeNamespace { A级... }

了Bh - > 命名空间SomeNamespace { B类...... }

+0

凉。我不知道同名命名空间在不同的类中是允许的。我会尝试。 编辑:如果我需要在B.h中使用A类,而B使用相同的名称空间呢?看来,Visual Studio会自动假定我自动使用“SomeNameSpace”,因此不必去“SomeNameSpace :: B”。我只是要求确认,因为Visual Studio有一种倾向,即不会立即告诉用户有什么错误(即使是编译期问题)。 –

+1

嗯,你是在你的命名空间里,不是吗? –

+0

是的,但是我的C++书没有提到这方面的任何内容。 :/ 感谢您的提示。 –

1

您不能在没有完整定义的范围中使用类(前向声明不够)。通常你可以在头文件中声明declare和在cpp中使用#include。我没有看到你组织试图的方式;规范的智慧是尽可能地转发声明,并在必要时#include。

2

一种不同的方法将直接从原包装头类为命名空间,然后它们包括,例如:

啊:

namespace SomeNameSpace { 
    class A{ 
     // Class definition 
     void something(); 
    } 
} 

A.cpp:

#include "A.h" 
namespace SomeNameSpace { 
    void A::something() 
    { 
    } 
    // And other function definitions 
} 

entity.h:

#include "A.h" 
#include "B.h" 
// And so on...