杂货边角(20):匿名非受限联合体实现类的“变长成员”variant member
2018-02-25 10:09
330 查看
#include <iostream> #include <cstring> using namespace std; /* 联合体的使用,最主要的效果便是内存空间的节省,当然额外的附加作用便是灵活性,但是这种灵活性是以牺牲 可读性为代价的 */ union T { string s;//因为string 是非POD类型,string有non-trivial的构造函数,故而系统会删除T的默认构造函数 //error: union member 'T::s' with non-trivial 'std::basic_string<_CharT, _Traits, _Alloc>::basic_string() [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]'| int n; public: T() { new (&s) string; } //placement new机制,直接在地址上强制类型初始化 ~T() { s.~string(); } }; struct Student{ Student(bool g, int a) : gender(g), age(a) {} bool gender; int age; }; class Singer { public: enum Type {STUDENT, NATIVE, FOREIGNER}; Singer(bool g, int a): s(g,a) { t = STUDENT; } Singer(int i) : id(i) { t = NATIVE; } Singer(const char* n, int s) { int size = (s>9) ? 9 : s; memcpy(name, n, size); name[s] = '\0'; t = FOREIGNER; } ~Singer() {} private: Type t; union { //C++11引入的匿名的非受限结构体,从而配合类,可实现“变长成员”定义的效果variant member Student s; int id; char name[10]; }; }; int main() { T t; //因为T的默认构造函数被删除了,所以如果不显示定义,则会出现error: use of deleted function 'T::T()' Singer a(true, 24); Singer b(85767); Singer c("Jack chou", 41); return 0; }
相关文章推荐
- 在类有成员变量的场景下, 按照虚表原理, 模拟虚函数实现
- 类的基本成员函数实现(构造,拷贝构造,拷贝赋值,移动构造,移动赋值,析构)
- UNIX环境高级编程学习之第十五章进程间通信 - 通过半双工匿名管道实现父子进程通信
- Go语言以匿名组合的方式实现继承
- 设计一个时间类Time, 包括时,分,秒等私有数据成员。要求实现时间的基本运算,一个时间加上另一个时间。。
- 如何利用c++11的新特性编写类成员线程函数并实现同步
- C++之STL(三):迭代器类vector::iterator 和 vector::reverse_iterator 的实现、迭代器类型、常用的容器成员
- C++ 实现把非静态成员函数作为回调函数(非static)
- 如何实现利用类成员函数创建线程
- 关于C++中类的成员函数实现的位置问题
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- C++加号运算符重载-全局函数、成员函数实现
- 达内学习笔记——静态成员函数,匿名对象,
- C#隐式实现接口成员与显示实现接口成员
- 在JaveWeb项目中配置Spring 匿名访问时,匹配规则的变相实现/*
- Java内部类(成员内部类、局部内部类、静态内部类、匿名内部类)
- 实现Profile购物车的匿名用户迁移
- ASP.NET 2.0下实现匿名用户向注册用户的迁移(下)
- 策略设计模式:父类持有接口成员变量,动态设定接口成员实现类,动态改变方法
- 通过binder实现系统和app匿名内存共享