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

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

【问题讨论】:

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

标签: c++ methods unions


【解决方案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++ 的优势之一是它不会忘记它实际上是在现实世界的硬件上运行的,而联合是可以大大简化这项工作的工具之一。
猜你喜欢
  • 1970-01-01
  • 2012-05-05
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
相关资源
最近更新 更多