C++的封装(十二):外部构造函数

通常,C++创建一个对象,都是调用构造函数对它初始化:

class AB {
	int a;
	int b;
public:
	AB(int ia, int ib) {a=ia; b=ib;}
	void display() {printf("a=%d, b=%d\n", a, b);}
	void other();
};

如果实现过程需要施加更多的控制,比如增加私有数据allow_debug_a,allow_debug_b作为控制选项,

class AB {
	int a;
	int b;
	int allow_debug_a;
	int allow_debug_b;
public:
	AB(int ia, int ib) {a=ia; b=ib;allow_debug_a=0;allow_debug_b=0;}
	void display() {printf("a=%d, b=%d\n", a, b);}
	void other();
};

如果这些选项不允许运行时改变,那么就需要在调用构造函数时一次性设定,这时构造函数就改为:

...
public:
	AB(int ia, int ib, int allow_a, int allow_b) {
		a=ia; b=ib;
		allow_debug_a=allow_a;
		allow_debug_b=allow_b;
	}

这样做行不通。因为如果有更多的选项,参数表越拖越长,逐渐变得可憎。何况,关于这些参数实现细节用户根本没有什么概念,让他创建对象时去选择这些选项,他也不知道选得对不对?

这时最好重开一个新的类,一个config类,让它去专注干这事。并且把构造函数搬到这个config类中去。

class AB {
	int a;
	int b;
	int allow_debug_a;
	int allow_debug_b;
private:
	AB();
public:
	void display() {printf("a=%d, b=%d\n", a, b);}
	void other();
friend class ABC_config;
};

class BC {
	int b;
	int c;
	int allow_debug_b;
	int allow_debug_c;
private:
	BC();
public:
	void display() {printf("b=%d, c=%d\n", b, c);}
	void other();
friend class ABC_config;
};

class ABC_config {
	int allow_debug_a;
	int allow_debug_b;
	int allow_debug_c;
public:
	ABC_config() {memset(this, 0, sizeof(*this));}
	void enable_debug_a(bool yn);
	void enable_debug_b(bool yn);
	void enable_debug_c(bool yn);

	AB *Create_AB(int a, int b){
		AB *p = (AB*) operator new(sizeof(AB));
		p->a=a; p->b=b;
		p->allow_debug_a= allow_debug_a;
		p->allow_debug_b= allow_debug_b;
		return p;
	}
		
	BC *Create_BC(int b, int c);
};

Create_AB(), Create_BC()是类AB, BC逻辑上的构造函数。变化之后,去掉了构造函数参数中的多余的选项。同时类AB, BC语法上的构造函数也禁掉了。创建重新变得简明了。

当然Create_AB(), Create_BC()作为config类的成员函数,仅仅是普通的成员函数。它们可以使虚函数,如果config类有派生类的话。

哦,这是对象工厂。那么ABC_config() 的这个构造函数怎么用了memset() ?这不是把虚函数表的指针破坏了?关于构造函数修复的问题,在我前文中讨论过了。可见C++的继承(五):构造函数问题 https://blog.csdn.net/aaasssdddd96/article/details/107778096。

相关推荐

  1. C++封装():外部构造函数

    2024-06-09 00:52:03       9 阅读
  2. C++中构造函数以及默认拷贝构造函数

    2024-06-09 00:52:03       12 阅读
  3. C#如何通过反射获取外部dll函数

    2024-06-09 00:52:03       12 阅读
  4. C++ 结构体构造函数

    2024-06-09 00:52:03       31 阅读
  5. C++ 构造函数参数顺序

    2024-06-09 00:52:03       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-09 00:52:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-09 00:52:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-09 00:52:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-09 00:52:03       18 阅读

热门阅读

  1. 服务器硬件基础知识有哪些?

    2024-06-09 00:52:03       7 阅读
  2. Linux的命令补全脚本

    2024-06-09 00:52:03       7 阅读
  3. Android Camera APP预览画面镜像及旋转处理

    2024-06-09 00:52:03       11 阅读
  4. 请求分页存储管理方式

    2024-06-09 00:52:03       8 阅读
  5. Flink 容错

    2024-06-09 00:52:03       8 阅读
  6. 5、js关于数组的常用方法(19种)

    2024-06-09 00:52:03       9 阅读
  7. ubuntu,确认cudnn是否安装成功

    2024-06-09 00:52:03       9 阅读
  8. C# WPF入门学习主线篇(十二)—— Canvas布局容器

    2024-06-09 00:52:03       11 阅读
  9. 富格林:有效杜绝被骗安全做单

    2024-06-09 00:52:03       10 阅读
  10. 【C++PCL】点云处理对称目标函数的ICP

    2024-06-09 00:52:03       8 阅读
  11. CasADi库入门求解二次规划问题例子

    2024-06-09 00:52:03       9 阅读
  12. 智能避障小车设计

    2024-06-09 00:52:03       9 阅读
  13. oracle中如何查询特定日期?

    2024-06-09 00:52:03       11 阅读
  14. 设计模式相关更新中

    2024-06-09 00:52:03       12 阅读