【面试题】剑指Offer-2-如何控制一个类生成对象的个数

来源:互联网 发布:青岛优创数据怎么样 编辑:程序博客网 时间:2024/05/16 05:21

题目概述

原题目是,如何控制一个类只生成一个对象

这里我们进行扩展

问题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;

小结

通过该题,需要掌握静态成员在类中的定义以及初始化方法
以及如何定义类的友元函数
发散思维,我们可以通过将拷贝构造函数,赋值运算符重载函数定义成私有成员来达到防拷贝

1 0
原创粉丝点击