我正在尝试用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()
是静态的(意味着与任何实例无关(,因此不需要从对象调用它,因此类名就足够了:
&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++中完成的经典方式。