gpt4 book ai didi

c# - 如何在 C++ 中声明类的静态实例?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:25:06 25 4
gpt4 key购买 nike

几个月前,我创建了一个名为 Vexed 的游戏的 C# 项目。现在我正在创建一个俄罗斯方 block ,但是是在 C++ 中。基本上我想使用我在其他项目中使用的相同逻辑,有点像这样:

我创建了一个名为“游戏”的类,其中包含有关游戏的所有信息。它有它的方法、变量和一切。然后,我创建了一个名为“PublicInstances”或类似名称的静态类,并在该类中声明了如下内容:

static class PublicInstances
{
public static Game vexedGame = new Game(); //This is C# and works.
}

这使得它的使用变得如此简单,因为我对游戏所做的任何更改都保存在我类的静态实例中,我可以在项目的任何地方访问它。我想知道如何用 C++ 做到这一点,创建我的游戏类的公共(public)或全局实例,这样我就可以访问它并在任何地方更改它,并在我的项目的任何窗体或类中更新所有内容。非常感谢您的帮助。

//对不起,如果我的英语不是最好的^^

最佳答案

回顾和总结

选项 1

您可以简单地声明和定义 Game 对象的全局实例。在头文件中,例如游戏.h:

extern Game globalGameObj;

当您在源文件中包含 game.h 时,globalGameObj 名称变得可见。您还需要创建一个实际对象。在源文件中,例如game.cc(任何类之外):

Game globalGameObj;

通过变量名访问它:

globalGameObj.do_some_work();

选项 2

使用一种通常称为单例的模式。将以下内容添加到您的游戏类 (game.h):

class Game
{
public:
static Game &shared_instance() {static Game game; return game;}

private:
// Make constructor private. Only shared_instance() method will create an instance.
Game() {/*whatever initialisation you need*/}
};

您使用 shared_instance() 方法访问 Game 实例:

Game::shared_instance().do_some_work();

您不要在上面使用任何类似static class PublicInstances 的东西。 C++ 允许您引入命名空间(例如 PublicInstances)以提供名称隔离并将您的全局对象保存在一个地方,但这可能会有点矫枉过正。无论如何,如果您的全局对象很少,那么它很可能是一个糟糕的设计。

哪个选项更好?有些人会争辩说应该使用单例模式。它保证只创建一个实例。然而,选项 1 和选项 2 都有相同的问题:它们在您的代码中引入了一个全局对象,所有缺点都归因于全局变量。我会说单例是一个伪装的全局对象。我看不出支持任何一种选择的决定性技术原因,所以我想说这是个人品味的问题。

历史记录:)

我对选项 2 的第一个建议是使用动态分配的 Game 对象而不是函数本地静态对象。

static Game *instance() {if (!_inst) _inst = new Game(); return _inst;}

很少有人提出这不是最好的方法了,谢谢Kal , argiopewebSimple . C++03 在存在线程的情况下初始化静态对象有问题。 C++11 保证静态的安全初始化。

C++11 草案,第 6.7 节

such a variable is initialized the first time control passes through its declaration;such a variable is considered initialized upon the completion of its initialization. [...]If control enters the declaration concurrently while the variable is being initialized,the concurrent execution shall wait for completion of the initialization.

关于c# - 如何在 C++ 中声明类的静态实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19130021/

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