C++11新特性(86)-类类型的union成员(2)

C++11新特性(86)-类类型的union成员(2)类类型的union成员C++的早期版本不允许union的成员是定义了构造函数或拷贝控制成员的类类型成员。

大家好,欢迎来到IT知识分享网。

经过一番准备,我们进入正题。

类类型的union成员

C++的早期版本不允许union的成员是定义了构造函数或拷贝控制成员的类类型成员,C++11中取消了这个限制。但是也别高兴得太早,因为这类union在发生涉及到类类型成员的值转换时需要根据需求调用相关类成员的构造函数或析构函数。

假设我们有下面的StrValue类。引入这个类的目的是为了在对象操作时可以输出日志信息。

C++11新特性(86)-类类型的union成员(2)

代码有点长,慢慢看。这个类主要用于存储字符串。它包含3个构造函数,一个析构函数,一个赋值运算符。另外还重载了输出运算符用于输出内部的字符串。C++11以后,允许把这个类作为下面union的成员。

C++11新特性(86)-类类型的union成员(2)

为union引入类类型成员后,带来了一个麻烦:在切换union有效成员的时候需要恰当的调用类成员的构造函数和析构函数。例如下面的代码:

C++11新特性(86)-类类型的union成员(2)

最初有效的是ival成员,接下来希望存储字符串时需要使用定位new方式调用构造函数;反之,当我们希望再次使用ival成员的时候,又需要调用sval成员的析构函数。如果不这样做,就无法保证内存管理正常进行。

使用类管理union成员

解决上述问题的方法就是C++最基本的特征:封装。我们可以将union封装到另一个类中。

C++11新特性(86)-类类型的union成员(2)

我们分类说明SmartUnion类的各个成员。

两个数据成员,一个是用于保存类型信息的ut,通过这个成员,SmartUnion类可以判断当前是哪个成员有效;另一个是包含整数和StrValue成员的匿名union,它是主角。

三个构造函数,一个默认构造函数,另外两个分别接受整数和字符串输入。注意这里的SmartUnion只是示例代码,真正使用的时候可能还要添加不少内容,例如拷贝构造函数。

三个赋值运算符,分别提供从整数,StrValue对象和SmartUnion对象赋值的功能。

经过一番准备之后,用法就简单了:

C++11新特性(86)-类类型的union成员(2)

作者一句话

本文内容偏多,希望各位可以参照C++Primer第五版 19.6节的内容加深理解。

代码下载链接

https://github.com/xueweiguo/OOThinking/blob/master/%20ClassUnionMember.cpp


觉得本文有帮助?请分享给更多人。

关注【面向对象思考】,轻松学习每一天!

面向对象设计,面向对象编程,面向对象思考!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/55502.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信