是否可以为命名空间分隔类?

时间:2013-07-09 19:21:20

标签: c++ namespaces

我想在许多不同的类中使用几个函数。我有几个派生自一个基类的类,所以试图使它基本类保存函数,然后子类可以调用它们。这似乎导致链接错误,所以根据这个问题的建议(Advantages of classes with only static methods in C++)我决定给名称空间一个摆动,但是每个头文件/文件中包含的唯一文件是resource.h,我不知道我想在我的函数中放置一个命名空间,因为它似乎专门用来搞乱。

我的问题是,如何创建一个只包含命名空间的类或我想要使用的函数,以便我可以只包含这个类并根据需要使用这些函数?

提前感谢您的帮助,我在互联网上找到的答案只关注一个文件,而不是像我希望解决的多个文件:)

2 个答案:

答案 0 :(得分:1)

您似乎对命名空间的使用方式感到困惑。在使用命名空间时,请记住以下几点:

  • 使用语法namespace identifier { /* stuff */ }创建命名空间。 { }之间的所有内容都将位于此命名空间中。
  • 您无法在用户定义的类型或函数中创建命名空间。
  • 命名空间是开放组构造。这意味着您可以稍后在其他代码中添加更多内容。
  • 与其他一些语言结构不同,未声明命名空间。
  • 如果您希望在命名空间范围内使用某些类和/或函数,请使用命名空间语法将其括在其定义的标题中。当标题获得#include' d。
  • 时,使用这些类的模块将看到命名空间

例如,您可以在Entity.h中执行:

// Entity.h
#pragma once

namespace EntityModule{
class Entity
{
public:
  Entity();
  ~Entity();
  // more Entity stuff
};

struct EntityFactory
{
  static Entity* Create(int entity_id);
};

}

main.cpp内,您可以像这样访问它:

#include "Entity.h"

int main()
{
  EntityModule::Entity *e = EntityModule::EntityFactory::Create(42);
}

如果您还希望Player位于此命名空间内,那么只需将namespace EntityModule包围在其中:

// Player.h
#pragma once
#include "Entity.h"

namespace EntityModule{
class Player : public Entity
{
  // stuff stuff stuff
};
}

这是因为上面的第3点。

如果由于某种原因您觉得需要在类中创建命名空间,可以使用嵌套类在某种程度上模拟它:

class Entity
{
public:
  struct InnerEntity
  {
    static void inner_stuff();
    static int  more_inner_stuff;
    private:
      InnerEntity();
      InnerEntity(const InnerEntity &);
  };
  // stuff stuff stuff
};

虽然这样做有一些重要的区别和警告:

  • 所有内容都符合static的条件,表明没有相关的特定实例。
  • 可以作为模板参数传递。
  • 最后需要;
  • 您无法使用abusing namespace Entity::InnerEntity;创建便捷的速记。但也许这是件好事。
  • 与名称空间不同,classstruct已关闭结构。这意味着您无法扩展定义后包含的成员。这样做会导致多重定义错误。

答案 1 :(得分:1)

你可以在命名空间中放置任何东西,但你不能把命名空间放在内容中(这不是一种非常正式的说法,但我希望你明白我的意思。

<强>有效

namespace foospace
{
    class foo
    {
    public : 
        foo();

        ~foo();

        void eatFoo();

    };
}

<强>无效

namespace foospace
{
    class foo
    {
    public : 
        foo();

        ~foo();

        namespace eatspace
        {  
            void eatFoo();
        }

    };
}

我不是100%肯定第二个例子不会编译,但无论如何,你不应该这样做。

现在,根据您的评论,您似乎想要这样的事情:

在文件Entity.h中,您的实体类定义:

namespace EntitySpace
{
    class Entity
    {
    public : 
        Entity();
        ~Entity();   
    };
}

在档案Player.h

#include "Entity.h"
namespace EntitySpace
{
    class Player : public Entity
    {
    public : 
        Player();
        ~Player();   
    };
}

在main.cpp文件中

#include "Player.h"

int main()
{
    EntitySpace::Player p1;
    EntitySpace::Player p2;

}

因此,您在EntitySpace命名空间中调用Player。希望这能回答你的要求。