首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在CPP中解析联合中的结构?

如何在CPP中解析联合中的结构?
EN

Stack Overflow用户
提问于 2012-02-10 22:01:12
回答 4查看 264关注 0票数 1

我有一个联合和枚举,例如:

代码语言:javascript
复制
typedef union{
    Home   HomeInfo;        
    Office OfficeInfo;          
} Info;

typedef enum{                               
    eHOME,  
    eOFFICE

} InfoType;

HomeOffice是其他结构。

我还有另一个函数,它的原型是

代码语言:javascript
复制
void SetInfo(InfoType, Info);

在函数调用过程中,如果InfoTypeeHOME,我会创建一个对象Info,Info info;,并填充HomeInfo details info.HomeInfo,然后调用

代码语言:javascript
复制
SetInfo(eHONE, info);

SetInfo定义:

代码语言:javascript
复制
SetInfo(InfoType infotype, Info info)
{
    if (eHOME == infotype)
    {
        // get the details from info.HomeInfo structure
         }
         else if(eOFFICE == infotype)
         {
            // get the details from info.OffiiceInfo structure
         }
}

如果我将eHOME作为InfoType传递,并传递OfficeInfo的详细信息,我如何获得无效的案例?虽然我过去常常在这个时候获取HomeInfo的详细信息,但其中有一些无用的值,所以错误不会被获取。在InfoType检查之后可以检查结构是什么吗?

EN

回答 4

Stack Overflow用户

发布于 2012-02-10 22:19:36

我不确定您在这里试图实现什么,但这种方法几乎可以肯定是错误的。我建议在这里使用继承:

代码语言:javascript
复制
enum InfoType
{
    eHome,
    eOffice,
};

class Info
{
public:
    InfoType type() const { return type_; }

protected:
    Info(InfoType t) : type_(t) {}

private:
    InfoType type_;
};

class HomeInfo : public Info
{
public:
    HomeInfo() : Info(eHome) {}
};

class OfficeInfo : public Info
{
public:
    OfficeInfo() : Info(eOffice) {}
};

现在SetInfo函数非常简单,如下所示:

代码语言:javascript
复制
void SetInfo(Info* info)
{
    if (info->type() == eHome)
    {
        HomeInfo* hi = (HomeInfo*)info;
        // ...
    }
    else if (info->type() == eOffice)
    {
        OfficeInfo* oi = (OfficeInfo*)info;
        // ...
    }
}
票数 0
EN

Stack Overflow用户

发布于 2012-02-10 22:19:48

void SetInfo(InfoType a,Info b);

也许您可以将&b转换为Home*,然后将Home和Office的第一个“类变量”硬编码为一个字符,您可以检测该字符,并使用特定值进行初始化以便于检测。

这有什么意义吗,,,

票数 0
EN

Stack Overflow用户

发布于 2012-02-10 22:20:14

在这种情况下,应该确保每次调用SetInfo时Info和InfoType都是一致的。

如果您想使用不一致的Info和InfoType调用SetInfo,例如:

代码语言:javascript
复制
InfoType type = eHOME;
Info info;
info.OfficeInfo.xxx = xxx;
SetInfo(type, info);

基本上,作为一个联合,如果没有这两种类型的进一步信息,您就无法区分info是OfficeInfo还是HomeInfo。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9228913

复制
相关文章

相似问题

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