对象的单个实例

时间:2013-11-28 08:38:22

标签: c++11 singleton private-constructor

我正在尝试用C ++ 11实现类似单身的对象。我从另一个用户那里得到了这个例子

它使用构造函数和复制构造函数private和default创建一个对象,以及一个返回静态对象的instance()函数。

据我所知,这应该可以防止创建这个对象的两个实例。但是正如你在main.cpp中看到的那样,我创建了两个实例并编译并运行。

我的对象创建错误还是什么?我不明白。

object.hpp:

#ifndef OBJECT_H
#define OBJECT_H

#include <iostream>
using namespace std;

class Object
{
private:
   Object() = default;
   Object(const Object&) = delete;
public:
   // Singleton in C++11
   static Object& instance() { static Object z; return z; }
};

#endif // OBJECT_H

main.cpp中:

#include "object.hpp"

int main() 
{
    Object* object = new Object();
    object->instance();

    Object* object2 = new Object();
    object->instance();

    return 0;
}

2 个答案:

答案 0 :(得分:2)

当我尝试编译代码时,我从编译器中得到了正确的错误:

  

main.cpp:error:调用类'Object'的私有构造函数           Object * ob1 = new Object();

所以我无法使用new创建两个对象。

答案 1 :(得分:1)

首先,main中的代码无法编译。 Object默认构造函数是私有的,因此您将无法执行:

Object * object = new Object();

其次,由于instance()是静态的(意味着与任何实例无关),因此无需从对象中调用它,类名称就足够了:

对象&安培; theInstance = Object :: instance();

最后,实例的代码是:

static Object& instance()
{
    static Object z;
    return z;
}

没关系。 C ++函数中的static变量意味着该对象实例化一次:当该函数第一次运行时。然后z将不会在函数末尾被销毁(与其他所谓的局部变量相反),并将被重新用于instance的下一次调用。

首次致电instance

  • z已创建
  • z z已退回

接下来的电话:

  • z已退回

单例是一个类,它意味着只会创建一个实例。您可以通过以下方式验证对象是否相同:

Object& a = Object::instance();
Object& b = Object::instance();

std::cout << &a << std::endl;
std::cout << &b << std::endl;

ab应该有相同的记忆地址。

这是单例的预期行为:如果多次调用对象构造函数(instance),则将返回相同的实例。

正如您所说,instance实际上阻止创建两个Object。也许你希望你编程在第二次调用instance时返回一些错误。如果你不是这种行为,你必须自己使用预期或返回NULL。然而,你编写的代码显示了用C ++完成单例的经典方式。

相关问题