用于存储特定于案例的数据的C ++联合用法

时间:2015-08-13 06:01:30

标签: c++ unions

假设我存储了一个人的数据。并且取决于它是男性还是女性的性别特定数据也将被存储。现在我应该使用Union存储性别特定的部分吗?这是一个好习惯还是有更好的方法,特别是使用C ++ 14?

2 个答案:

答案 0 :(得分:3)

Union仅适用于不使用类的基本类型。您的工会中没有std::string。因此,在C ++中很少使用union,但更常用于C。

在你的情况下,我会保持简单。最简单的方法是将所有数据成员放在同一个类中,而不管性别如何,只使用正确的数据。

class Person
{
   // common stuff
   int age;
   int height;

   // female specific stuff
   // ???

   // male specific stuff
   // ???
};

或者你可以像这样使用继承:

class Person {};
class FemalePerson : public Person {};
class MalePerson : public Person {};

并且仅在相应的派生类中具有性别特定部分。

答案 1 :(得分:1)

您可以在类

中声明一个未命名的联合
class Person
{
    int gender;
    // common stuff, which is empty in your case
    int age;
    int height;

    union {
        struct {
            // female specific stuff
            // ???
        } female;

        struct {
            // male specific stuff
            // ???
        } male;
    }
};

然后使用

之类的东西
Person p;
switch (p.gender)
{
case MALE:
    p.male.some_attribute = somevalue;
    break;
case FEMALE:
    p.female.some_attribute = somevalue;
    break;
}

如果男性和女性之间没有共同的属性名称,您甚至可以删除结构名称,因此您只需要直接使用p.some_male_attributep.some_female_attribute而无需其他点。