我想在许多不同的类中使用几个函数。我有几个派生自一个基类的类,所以试图使它基本类保存函数,然后子类可以调用它们。这似乎导致链接错误,所以根据这个问题的建议(Advantages of classes with only static methods in C++)我决定给名称空间一个摆动,但是每个头文件/文件中包含的唯一文件是resource.h,我不知道我想在我的函数中放置一个命名空间,因为它似乎专门用来搞乱。
我的问题是,如何创建一个只包含命名空间的类或我想要使用的函数,以便我可以只包含这个类并根据需要使用这些函数?
提前感谢您的帮助,我在互联网上找到的答案只关注一个文件,而不是像我希望解决的多个文件:)
答案 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;
创建便捷的速记。但也许这是件好事。class
和struct
是已关闭结构。这意味着您无法扩展定义后包含的成员。这样做会导致多重定义错误。答案 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
。希望这能回答你的要求。