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。

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值