这是关于堆栈溢出的第一个问题,所以请保持温和。
首先让我解释一下我希望看到的确切行为。如果您熟悉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类中无需担心。因为我不知道我可以进行哪种优化 我想是这样做的,或者确切地说是什么线程需要(从未做过使用它的真实项目) 能够可预测地控制Singletons实例化的时候会是一件好事。
想象一下,如果进程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/)提供了一个有保护的指针和其他很酷的功能。
答案 0 :(得分:1)
为什么不直接使用Singleton::GetInstance
?为什么需要将它存储在(只读)全局中?这也解决了依赖问题。
答案 1 :(得分:1)
仅允许通过以下方式进行访问:
Singleton::GetInstance
通过将复制和赋值构造函数设为私有来强制执行此操作
private:
Singleton(){}
Singleton(Singleton const&){}; //copy ctor private
Singleton& operator=(Singleton const&){};
答案 2 :(得分:0)
想象一下,如果流程A创建流程B,其中B包含多个单身人士
您认为您需要所有这些单身人士到底是什么?你知道Anti Singleton Movement吗? ; - )