C++:带方法的联合体?

24

一个union有一个或多个方法会有什么问题吗?还有需要注意的地方吗?(我可以看到构造函数/析构函数因为精神分裂症的原因可能会有问题)


除了你提到的析构函数和释放内存方面,我没有发现任何问题。 - Jim
1
这正是为什么您不能拥有具有非平凡构造函数、析构函数或赋值运算符的类/结构类型的联合成员。 - Oliver Charlesworth
2个回答

30

来自C++03和C++0x(草案N3092)标准:

9.5 联合体
联合体可以有成员函数(包括构造函数和析构函数),但不能有虚函数(10.3)。联合体不应该有基类,也不应该用作基类。

使用聚合初始化语法(U u = { 42 };)或之后设置成员(U u; u.i = 42;)来初始化联合体并不“有问题”。使用构造函数(U u( 42 );)初始化它也是可以的。
唯一的“限制”是你不能对具有用户定义构造函数的联合体使用聚合初始化语法。


这是C++0x的新特性,还是已经成为C++标准的一部分了? - Jason S
@Jim:那部分没有改变。 - Eugen Constantin Dinca
联合体可以有构造函数吗?那么什么时候构造会是一个问题或不是问题呢? - Jason S

-12

你怎么可能实现这样的东西?这里有一个联合体指针,希望你不介意你不知道哪些变量是安全使用的。

联合体实际上已经成为了一种过时的语言特性 - 它们已经被像 boost::variant 或 boost::any 这样的基于库的方法完全取代。有点类似于 void* 和函数宏 - 在 C++ 中它们很少有用,相比其他选项。


3
不要忘记嵌入式世界。有时候事情并不完全是类型安全的。 - Jason S
@Jason:嵌入式是如何改变任何东西的呢?要么你知道它是什么类型,那就使用普通变量;要么你知道所有类型都相关,那就使用多态性;要么在执行任何操作之前,你需要知道它是什么类型。 - Puppy
6
Embedded 并不改变语言本身,但它限制了动态内存分配和多态性(以及大部分的 boost 库不适用),这使你更倾向于其他技术。通常是两个 16 位数字和一个 32 位数字之间的联合,或者是一个 16 或 32 位数字和一个具有位域的结构体之间的联合。在这些情况下,联合的两个成员都有同样有效的内容;它们是两种类型。 - Jason S
12
C++的优势之一在于它不会忘记它实际上是在真实世界的硬件上运行,而共用体是其中一种可以极大简化这项工作的工具。 - Rob K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接