不允许定义一个类的多个实例[重复]
Posted
技术标签:
【中文标题】不允许定义一个类的多个实例[重复]【英文标题】:Disallow defining more than one instance of a class [duplicate] 【发布时间】:2015-04-02 09:41:19 【问题描述】:之前我读到不允许定义一个对象的更多实例。但我再也找不到那篇文章了。谁能告诉我如何防止从 CLog
类定义任何其他对象?
class CLog
........
log;
【问题讨论】:
Google 单例模式,然后了解您为什么shouldn't be using them。 @Praetorian 我想阻止定义 log2 和 log3 ... 。即使我的程序处于调试模式,你认为我应该避免它吗? 调试模式与您的定义无关。是的,Singleton 是你的答案 %) @barej 你是looking for。至于使用或不使用单例模式,任何说单例本质上不好的人都和说单例是解决所有问题的答案一样愚蠢。 @barej 所以不要创建多个实例。这是一个question,讨论了在不使用单例的情况下实现日志记录。 【参考方案1】:单例的另一种解决方案是使用Service Locator
模式。
在http://gameprogrammingpatterns.com/service-locator.html 中有很好的描述以及如何使用它。
与单例一样,这种模式应该谨慎使用,但是日志系统可能是一个很好的用例,如果没有别的,它会教你一些新的设计模式。
【讨论】:
【参考方案2】:将您的构造函数设为私有。 定义一个返回类实例的公共方法。
class sample
private:
sample();
static *sample instance;
public:
static *sample getInstance()
if (instance != null)
instance = new sample();
return instance;
getInstance() 方法在创建类实例之前创建它检查实例是否存在,如果存在则返回现有实例,否则创建新实例。通过这种方式,您可以使您的类创建类的单个实例。 由于构造函数是私有的,没有人可以使用构造函数创建对象。
【讨论】:
这不是线程安全的;使实例本身成为本地静态的。 从本质上讲,当然该类不是线程安全的,并且 * 位于错误的位置 v 并且您没有禁用复制构造 @rubenv 是 Meyers 单例。 C++11 标准声明您的构造确实是线程安全的,但销毁顺序未确定。 call_once 也是一个不错的选择以上是关于不允许定义一个类的多个实例[重复]的主要内容,如果未能解决你的问题,请参考以下文章