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

题目概述

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

这里我们进行扩展

问题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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值