C ++:与方法的联合?

Posted

技术标签:

【中文标题】C ++:与方法的联合?【英文标题】:C++: unions with methods? 【发布时间】:2011-05-02 15:48:33 【问题描述】:

联合拥有一种或多种方法有什么问题吗?或者有什么需要注意的? (我可以看到构造函数/析构函数由于精神分裂症的原因而存在问题)

【问题讨论】:

除了你提到的析构函数和释放内存之外,我认为它们没有任何问题。 这就是为什么不能拥有具有非平凡构造函数、析构函数或赋值运算符的类/结构类型的联合成员的原因。 【参考方案1】:

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

9.5 联合 联合可以有成员函数(包括 构造函数和析构函数),但不是 虚拟 (10.3) 函数。工会 不应有基类。工会 不得用作基类。

使用聚合初始值设定项语法 (U u = 42 ;) 或之后设置成员 (U u; u.i = 42;) 初始化联合不是“有问题的”。也没有使用构造函数 (U u( 42 );) 对其进行初始化。 唯一的“问题”是您不能对具有用户定义构造函数的联合使用聚合初始化器语法。

【讨论】:

这是 C++0x 的新功能,还是 C++ 标准的一部分? @Jim:那部分没有改变。 联合可以有构造函数吗?那么什么时候/不是施工问题?【参考方案2】:

你怎么可能实现这样的事情?这是一个指向联合的指针,希望您不要介意您不知道哪些变量可以安全使用,哪些不是。

无论如何,联合实际上是一种已死的语言特性——它们已经完全被基于库的方法所取代,例如 boost::variant 或 boost::any。有点类似于 void* 和功能宏 - 与其他选项相比,它们在 C++ 中很少有用。

【讨论】:

不要忘记嵌入式世界。有时事情不是 100% 类型安全的。 @Jason:嵌入如何改变什么?要么你知道它是什么类型,所以使用常规变量,你知道所有类型都是相关的,所以使用多态,或者你需要知道它是什么类型,然后才能做任何事情。 Embedded 并没有改变语言本身的任何内容,但它确实限制了动态内存分配和多态性(并且大部分提升已经过时),从而使您偏向于其他技术。最常见的是两个 16 位 # 和一个 32 位 # 之间的并集,或者是 16 位或 32 位 # 和带有位域的结构之间的并集。在这些情况下,工会的两个成员都有同样有效的内容;这两种类型。 C++ 的优势之一是它不会忘记它实际上是在现实世界的硬件上运行的,而联合是可以大大简化这项工作的工具之一。

以上是关于C ++:与方法的联合?的主要内容,如果未能解决你的问题,请参考以下文章

负载均衡进阶:SLB常见问题解决方法

带方法的 C++ 结构,不带方法的 C 声明

c#/c++ 如何将结构的结构与 marshal.sizeof 联合

云平台与车辆can的通讯方法,以及linux下用命令行将c文件打包生成so库的方法

如何跟踪从Java到C的JNI方法?

C#-面向对象——如何调用使用类 普通方法静态方法的使用