2

【C++】阻止类被实例化

 2 years ago
source link: https://blog.csdn.net/haolianglh/article/details/120519076
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

【C++】阻止类被实例化

sanyu.lh 2021-09-27 23:24:11 19
分类专栏: 杂七杂八 文章标签: c++
专栏收录该内容
9 篇文章 0 订阅

不想一个类被实例化通常有两个目的:抽象类和工具类

实现该类的的就是想成为一个抽象类,抽象类一般只被继承,不能被实例化,例如最基本的例子

  1. 【动物类】是一个抽象类;
  2. 【猴子类】【猫类】【狗类】这三个类继承自【动物类】;
  3. 【猴子类】【猫类】【狗类】可以被实例化;
  4. 【动物类】不能被实例化;
    这种类更多的是用来定义接口,而完全不关心实现。

这种类提供一些功能但是一般不需要实现成一个实体,感觉上这种类更多的像是发挥了namespace的作用,或者说把一些功能模块化,体现隔离或者解耦思想。例如一个所谓的【计算类】用于计算“加 减 乘 除”四种最简单的计算。只需要提供 add(), sub(),multi(),div()四个方法就可以了,也不需要什么成员变量,也不需要维护什么状态。

在代码层面如何做到禁止类被实例化呢,一般是两种办法:

  1. 为类定义纯虚成员函数;
  2. 将构造函数声明为protect或者private。

pure virtual函数会导致抽象class,这是定理,因此只要为类提供一个pure virtual函数就可以达到禁止类被实例化的目的。但是这就是说我们必须要给这个类塞一个pure virtual函数,为了阻止实例化硬塞一个pure virtual似乎不够优雅,有没有别的方法呢。《Effective C++》条款7的表述就非常直接了:为你希望它成为抽象的那个class声明一个pure virtual析构函数
但是抽象类一般通常是会被继承的,具有多态目的,这导致需要为这个pure virtual析构函数提供一份定义。这好像非常别扭因为Meyers在条款34中又说为pure virtual函数提供实现是“令人意外的”。当然我们可以认为一个有定义的pure virtual析构函数就是“实现抽象类的官方指定权威方法”。
因此,使用有定义的pure virtual析构函数是阻止类被实例化的一个方法,但仅限于抽象类。

非public的构造函数

如果目的是工具类怎么办呢,一般的做法是把构造方法声明为private,自然就没法实例化了,因为外界无法调用这个构造函数。
但是如果这个类同时又提供了一个public静态方法,这个静态方法是可以调用私有的构造函数的。
所以,非public构造函数+静态方法调用构造函数一般是用于单例输出的场景。如果仅仅是为了实现【工具类】,就需要确保不会有静态方法调用构造函数。

https://www.cnblogs.com/moonz-wu/archive/2008/05/07/1186065.html
https://blog.csdn.net/qq_38755753/article/details/103298444?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.no_search_link


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK