在结构中初始化union - c ++

时间:2017-07-23 21:48:42

标签: c++

我的代码:

#include <iostream>

using namespace std;

struct widget
{
    char brand[20];
    int type;
    union id
    {
        long id_num;
        char id_char[20];
    }id_val;
};

int main()
{
    widget prize = 
    {"Rolls", 0, "A2X"};

    return 0;
}

问题在于初始化结构中的并集时初始化为“A2X”。当我传递“A2X”时,编译器不知道我想选择带有字符数组的第二个选项,它需要长类型。当我把

  

char id_char [20]

之前

  

long id_num

一切都好。但我想知道如何强制编译器接受带有char的“A2X”作为union中的第二个选项。谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

  

但我想知道如何强制编译器接受&#34; A2X&#34;将char作为工会的第二选择。

您可以使用构造函数:

id(char const *id_char) {
    std::strcpy(this->id_char, id_char);
}

或者,您可以使用widget构造函数。

缺点是如果您使用太大的输入字符串进行初始化,编译器可能无法发出警告。显示的普通构造函数可以使用strlen进行扩展,以检查运行时的溢出。如果您选择检查,我建议抛出异常。

答案 1 :(得分:0)

这适用于-std=c++11

#include <cstring>
#include <stdexcept>

struct widget
{
    char brand[20];
    int type;
    union id
    {
        long id_num;
        char id_char[20];
    }id_val;
    widget(char const*Str, int Type, char const *Id);
};

widget::widget(char const*Str, int Type, char const *Id) 
{
    if (strlen(Str)+1 > sizeof brand)
        throw std::length_error{"brand too large"};
    memcpy(brand,Str,strlen(Str)+1);
    type = Type;
    if (strlen(Id)+1 > sizeof id_val.id_char)
        throw std::length_error{"id too large"};
    memcpy(id_val.id_char,Id,strlen(Id)+1);

}

int main()
{
    widget prize = {"Rolls", 0, "A2X"};

    return 0;
}