实现一个只能创建一个对象的类,一个类按理来说肯定能创建出无数个对象,如何让一个类只创建一个对象呢?
我们来一步步的看
class A
{
public:
A()
{}
};
int main()
{
A a1,a2,a3.....;
}
毫无疑问A这个类可以实例化出无数个对象。我们知道创建对象需要调用构造函数来创建对象
所以我们可以这样一步步的来走:
- 我们可以把对象的构造函数给屏蔽掉。那么如何屏蔽掉构造函数。 因为构造函数你不写,也会生成默认的构造函数。
- 我们既然屏蔽不了构造函数,我们可以把构造函数定义成私有函数,在类外面访问不到。
- 但是这样的话,连一个对象都构建不出来了。所以我们要在共有public下,定义一个获取对象的接口
所以就有了
class A
{
public:
A& GetA() // 获取对象的接口
{
return A(); //调用构造函数,创建对象并返回
}
private:
A()
{}
};
但是,又有问题来了,我们怎么调用GetA()这个函数,调用GetA()函数必须创建一个A类型的对象, 通过 对象.GetA()来调用,但是构造函数被我们定义成私有函数了,我们现在连一个对象都创建不出来。所以就卡在这里了。
我们不能通过 对象.GetA()的方式来调用,因为对象根本就创建不出来,那毫无疑问,还有一种方式可以通过 A:: 来调用
GetA()函数。所以我们将GetA()函数设置成static函数,表明GetA()函数在静态区,可以突破类域去调用。
所以就有了
class A
{
public:
static A& GetA() // 获取对象类的接口
{
return A();
}
private:
A()
{}
};
int main()
{
A a = A::GetA();
A b(a);
A c(a);
}
但是,问题又来了,要求只创建出一个对象,但是我们还是可以通过拷贝构造函数来创建多个对象,尽管我们不写,编译器也会生成默认的拷贝构造函数。所以我们要将拷贝构造屏蔽掉。
class A
{
public:
static A& GetA()
{
return A();
}
private:
A()
{}
//C++ 98直接就定义成私有,类外不能访问
A(const A& a);
//C++11 就直接将拷贝构造给屏蔽掉
//A(const A& a) = delete;
};
至此,我们的只能创建一个对象的类就大功告成。 缕清思路,慢慢分析,理解起来就会更快。