0

我正在尝试用 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;
}
4

2 回答 2

2

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

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

所以我将无法使用new.

于 2013-11-28T08:43:00.880 回答
1

首先你的代码main不会编译。Object默认构造函数是私有的,所以你不能这样做:

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

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

Object& theInstance = Object::instance();

最后,实例的代码是:

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

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

所以在第一次调用instance

  • z被建造
  • zz 返回

在接下来的电话中:

  • z被退回

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

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

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

a并且b应该具有相同的内存地址。

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

所以正如你所说,instance实际上阻止了两个Object. 也许您希望您的程序在第二次调用instance. 如果你不想要这种行为,你必须自己使用expections或返回NULL。然而,您编写的代码显示了在 C++ 中完成单例的经典方式。

于 2013-11-28T08:57:27.053 回答