在一个标头和一个名称空间中堆叠多个前向声明

时间:2012-05-31 03:06:42

标签: c++ header namespaces forward-declaration

我有一组要实现的类,我计划按以下方式执行:

(1)一个主头文件(entity.h),它将这些类的所有前向声明都包含在一个名称空间中,即:。

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

(2)每个类都有单独的头文件(即A.h,B.h),它们定义了类并声明了所有组成变量和方法。

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

现在,我尝试通过#include "entity.h"来实现此方案,但每当我尝试使用其中一个类时,我都会遇到“模糊”错误。如果我跳过步骤(1)并简单地包括每个类的所有个体头文件,那么我没有那个问题(这就是我编写代码的方式)。

无论如何,我的计划是否可行?有没有办法让它发挥作用?我真正想要的是有一种方法将每个自定义对象放在一个命名空间中。我想我可以通过简单地将所有类声明放入一个文件来完成这项工作,但这会使entity.h膨胀。

我搜索过关键字“前向声明”,“C ++”,“命名空间”,“一个命名空间”,“主标题”,“标题”,找不到任何相关的内容。也许我想做的是错的?

3 个答案:

答案 0 :(得分:2)

另一种方法是将类直接从原始标题包装到命名空间中,然后包括它们,例如:

A.H:

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...

答案 1 :(得分:2)

你不能使用“A级”;在你的entity.h中,因为这意味着你实际上是在宣布一个班级,但你已经在A.h中完成了 您可以在entity.h中添加整个声明,但不能使用任何A.h,B.h等。 或者,您可以在每个* .h文件中使用相同的命名空间: A.h - > namespace SomeNamespace {     A级...... }

B.h - > namespace SomeNamespace {     B级...... }

答案 2 :(得分:1)

您不能在没有完整定义的范围内使用类(前向声明是不够的)。通常你可以在标题中转发声明,在cpp中转发#include。我没有看到组织你想要的方式的重点;规范的智慧是尽可能转发声明,并在必要时进行#include。