gpt4 book ai didi

c++ - 在 C++ 中实现 C# "readonly"行为

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

这是我关于堆栈溢出的第一个问题,所以要温和。

让我先解释一下我希望看到的确切行为。如果您熟悉 C#,那么您就会知道将变量声明为“只读”允许程序员为该变量赋值一次。进一步尝试修改变量将导致错误。

我追求的是:我想确保我定义的任何和所有单类都可以在我的程序中准确地实例化一次(底部有更多详细信息)。

我实现目标的方法是使用 extern 来声明对单例的全局引用(稍后我将在我选择的时间实例化它。我所拥有的看起来像这样,

namespace Global
{
extern Singleton& mainInstance; // not defined yet, but it will be later!
}

int main()
{
// now that the program has started, go ahead and create the singleton object
Singleton& Global::mainInstance = Singleton::GetInstance(); // invalid use of qualified name
Global::mainInstance = Singleton::GetInstance(); // doesn't work either :(
}

class Singleton
{
/* Some details ommited */

public:
Singleton& GetInstance()
{
static Singleton instance; // exists once for the whole program
return instance;
}
}

然而这并没有真正起作用,我不知道从这里去哪里。

关于我所反对的一些细节:

我担心线程问题,因为我正在编写处理游戏逻辑的代码,同时与几个第三方流程和我将创建的其他流程进行通信。最终我会有实现某种同步,以便多个线程可以访问信息在 Singleton 类中不用担心。因为我不知道我可能会做什么样的优化喜欢做,或者到底线程需要什么(从来没有用它做过一个真正的项目),我在想能够预测地控制何时实例化单例将是一件好事。

想象一下,如果进程 A 创建进程 B,其中 B 包含针对多个文件和/或库分布的多个单例。如果我不能可靠地确保实例化这些单例对象的顺序,那将是一场真正的噩梦(因为它们可能相互依赖,并且在 NULL 对象上调用方法通常是一件坏事)。

如果我在 C# 中,我会只使用 readonly 关键字,但有什么方法可以实现它(编译器支持)C++ 中的行为?这是个好主意吗?感谢您的任何反馈。


编辑

如果我被锁定在遵循上面的代码示例,则选择的答案将是完成我需要的最简单的方法。尽管我只打算制作这些 EntryPoint 对象之一,但我还是决定改变模式而不是单例模式。

class EntryPoint
{

/* Intentionally defined this way to discourage creation */
EntryPoint(const EntryPoint &); // undefined & private
EntryPoint& operator=(const EntryPoint &); // undefined & private

// public
EntryPoint()
{
/* All of the action is performed here! */
}

/* Other supporting functions */
}

// The easier to understand main function!
int main()
{
EntryPoint * ep = new EntryPoint(); // transfer control to the entrypoint
delete ep;
}

我认为我需要所有这些单例的原因之一是我计划创建一个更大的架构来支持模块化插件类型的应用程序。我还想要更多的错误检查和内存保护,以最大限度地减少内存泄漏。我很高兴地发现跨平台 Qt ( http://qt.nokia.com/ ) 提供了 protected 指针和其他很酷的功能。

最佳答案

为什么不直接使用 Singleton::GetInstance 呢?为什么需要将其存储在(只读)全局中?这也解决了依赖性问题。

关于c++ - 在 C++ 中实现 C# "readonly"行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2980219/

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