1

我有几个函数想在许多不同的类中使用。我有几个类是从一个基类派生的,所以试图让它基类保存函数,然后子类可以调用它们。这似乎会导致链接错误,因此按照这个问题的建议(C++ 中只有静态方法的类的优点)我决定给命名空间一个摆动,但是每个头文件/文件包含的唯一文件是 resource.h,而且我不想在那里为我的函数放置一个命名空间,因为它似乎专门用来搞乱。

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

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

4

2 回答 2

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;

}

所以你Player在 EntitySpace 命名空间中调用。希望这能回答你的问题。

于 2013-07-09T22:44:32.873 回答
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;. 但也许这是一件好事。
  • 与命名空间不同,class它们struct封闭结构。这意味着一旦定义,您就无法扩展它包含的成员。这样做会导致多重定义错误。
于 2013-07-09T22:41:27.297 回答