【问题标题】:Why an union wont allow its elements to have an user-defined constructor?为什么联合不允许其元素具有用户定义的构造函数?
【发布时间】:2012-06-20 11:07:03
【问题描述】:

当第一个结构有构造函数时,如何使第二个结构工作? 我得到错误:

error C2620: member 'test::teststruct::pos' of union 'test::teststruct::<unnamed-tag>' has user-defined constructor or non-trivial default constructor

代码:

struct xyz {
    Uint8 x, y, z, w;
    xyz(Uint8 x, Uint8 y, Uint8 z) : x(x), y(y), z(z) {}
};
struct teststruct {
    union {
        Uint32 value;
        xyz pos; // error at this line.
    };
};

我可以使用一个函数来初始化 xyz 结构,但这不会慢很多吗?更不用说:我有大量的结构,我需要创建自己的函数,其前缀为 init_xyz() 等,这并不好。有没有其他方法可以解决这个问题?

【问题讨论】:

  • @DavidRodríguez-dribeas,没有其他方法可以解决这个问题吗?
  • 你用 unions 做什么,你想节省内存吗?
  • @Rookie:考虑使用命名构造函数作为命名约定struct xyz { static xyz init(int x, int y, int z); }; 的变通方法,就性能而言,构造函数 函数,相同的优化可以包括内联在内,因此应该没有性能差异。
  • @DavidRodríguez-dribeas,但是为什么我听说我总是应该使用初始化列表,因为它们更快?
  • @ScottLangham,我不是想节省内存,而是简化数据结构:我可以重复结构 4 次,或者我可以为变量提供更多别名。我目前也在使用 structs 类型的类型转换器:我可以为一个内存位置使用 3 种不同的类型,当我使用该内存时,我选择正确的类型,例如 data.int16_a 或 data.int32 等。我可以转换每次我使用它们时手动设置,但我发现联合非常适合这种用途。

标签: c++ visual-c++ unions c++03


【解决方案1】:

可能会避免这种情况:

struct A {
    Uint8 a;
    A() : a(111) {}
};

struct B {
    Uint8 b;
    B() : b(2222) {}
};

struct teststruct {
    union {
        A aValue;
        B bValue;
    };
};

应该发生什么,A 和 B 构造函数都将尝试以不同的方式初始化相同的内存。与其有一些规则说哪个会赢,不如说不允许用户定义的构造函数可能更容易。

【讨论】:

  • 是的,但是...我没有不带参数的构造函数,所以它甚至不应该尝试初始化它,所以我看不出有问题发生。
  • 是的,但是 C++03 基本上可以工作,因此如果您有一个具有构造函数的类或结构,则必须调用该构造函数来初始化该类或结构类型的对象。你必须打破这个规则才能让它按照你想要的方式工作。仅仅因为在您的特定情况下它可以正常工作,并不意味着它应该以这种方式工作。同样,如果没有人从相反的方向驶来,您可以在错误的道路上很好地行驶……但将错误的一侧驾驶定为非法仍然很有用。
【解决方案2】:

来自 C++03,9.5 联合,第 162 页

联合可以具有成员函数(包括构造函数和析构函数),但不能具有虚拟 (10.3) 函数。联合不应有基类。联合不应用作基类。具有非平凡构造函数 (12.1)、非平凡复制构造函数 (12.8)、非平凡析构函数 (12.4) 或非平凡的类的对象复制赋值运算符(13.5.3、12.8)不能是联合的成员,也不能是此类对象的数组

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-16
    • 2013-03-03
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多