我正在尝试用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;
}
答案 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;
a
和b
应该有相同的记忆地址。
这是单例的预期行为:如果多次调用对象构造函数(instance
),则将返回相同的实例。
正如您所说,instance
实际上阻止创建两个Object
。也许你希望你编程在第二次调用instance
时返回一些错误。如果你不是这种行为,你必须自己使用预期或返回NULL
。然而,你编写的代码显示了用C ++完成单例的经典方式。