gpt4 book ai didi

c++ - 命名空间的单独类是否可取?

转载 作者:行者123 更新时间:2023-11-30 04:16:45 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

例如,在您的 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; 创建方便的速记。但这也许是一件好事。
  • 与 namespace 不同,classstruct封闭 结构。这意味着一旦定义,您就不能扩展它包含的成员。这样做会导致多重定义错误。

关于c++ - 命名空间的单独类是否可取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17556443/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com