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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/craftsman1970/article/details/83350393

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

类类型的union成员

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

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

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

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

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

使用类管理union成员

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

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

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

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

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

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

作者一句话

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

代码下载链接

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

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

阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】

猜你喜欢

转载自blog.csdn.net/craftsman1970/article/details/83350393