题目概述
原题目是,如何控制一个类只生成一个对象
这里我们进行扩展
问题1:控制一个类不能生成对象
问题2:控制一个类只生成一个对象
问题3:控制一个类生成对象的个数在一定数量之间
问题1:如何控制一个类不能生成对象
解决思路
一个类生成对象必然会调用其构造函数
这里只需将构造函数定义成私有成员,便可实现一个类无法生成对象
代码实现
class A
{
private:
A()
{}
A(const A&)
{}
};
void Test()
{
A a;//a无法生成
}
问题2:如何控制一个类只生成一个对象
接着上题思路,将构造函数定义成私有成员
方法(1)
通过友元函数访问类的私有构造函数
代码实现
class A
{
public:
friend A& construct();
private:
A()
{}
A(const A&)
{}
};
A& construct()
{
static A a;
return a;
}
void Test()
{
construct();
}
方法(2)
通过静态成员函数访问私有构造函数
代码实现
class A
{
public:
static A& construct();
private:
A()
{}
A(const A&)
{}
};
A& A::construct()
{
static A a;
return a;
}
void Test()
{
A::construct();
}
问题3:如何控制一个类生成的对象的数量在一定数量之间
思路
定义两个静态成员变量,一个为num,统计对象的个数
另一个是maxsize,初始化为允许最多生成对象的个数
在调用构造函数的时候,判断num是否已经达到最大值
若达到,则抛出异常
否则,自增num
代码实现
//3、如何控制一个类生成对象的数量在一定的范围之间
#include<iostream>
using namespace std;
class A
{
public:
A()
{
if (num >= maxsize)
{
throw string("The object is full");
}
++num;
}
~A()
{
--num;
}
private:
static size_t maxsize;
static size_t num;
};
size_t A::maxsize = 10;
size_t A::num = 0;
小结
通过该题,需要掌握静态成员在类中的定义以及初始化方法
以及如何定义类的友元函数
发散思维,我们可以通过将拷贝构造函数,赋值运算符重载函数定义成私有成员来达到防拷贝