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

    xiaoxiao2021-03-25  106

    题目概述

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

    这里我们进行扩展

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

    小结

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

    转载请注明原文地址: https://ju.6miu.com/read-12480.html

    最新回复(0)