对象的单个实例



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

它创建一个对象,其中构造函数和复制构造函数私有和默认,以及一个 instance(( 函数来返回静态对象。

据我了解,这应该可以防止创建此对象的两个实例。但正如您在 main .cpp中看到的那样,我创建了两个实例,然后它编译并运行。

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

对象.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

主.cpp:

#include "object.hpp"
int main() 
{
    Object* object = new Object();
    object->instance();
    Object* object2 = new Object();
    object->instance();
    return 0;
}

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

main.cpp:错误:调用类"对象"的私有构造函数 对象* ob1= 新对象(( ;

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

首先,

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

对象* 对象 = 新对象((;

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

Object

&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++中完成的经典方式。

相关内容

  • 没有找到相关文章

最新更新