首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在结构- c++中初始化联合

在结构- c++中初始化联合
EN

Stack Overflow用户
提问于 2017-07-23 21:48:42
回答 2查看 802关注 0票数 2

我的代码:

代码语言:javascript
复制
#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_char20

在此之前

长id_num

一切都很好。但我想知道如何强制编译器接受"A2X“,而char是联合中的第二个选项。谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-23 21:58:08

但我想知道如何强制编译器接受"A2X“,而char是联合中的第二个选项。

您可以使用构造函数:

代码语言:javascript
复制
id(char const *id_char) {
    std::strcpy(this->id_char, id_char);
}

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

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

票数 1
EN

Stack Overflow用户

发布于 2017-07-23 22:01:15

这适用于-std=c++11

代码语言:javascript
复制
#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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45270196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档