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

How to parse a structure in a union in CPP?

本文关键字:结构 CPP      更新时间:2023-10-16

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

typedef union{
    Home   HomeInfo;        
    Office OfficeInfo;          
} Info;
typedef enum{                               
    eHOME,  
    eOFFICE
} InfoType;

HomeOffice是其他结构。

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

void SetInfo(InfoType, Info);

在函数调用期间,如果InfoType eHOME,我将创建一个 Info、Info info; 并填充HomeInfo详细信息info.HomeInfo并调用

SetInfo(eHONE, info);

设置信息定义:

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结构是什么?

void SetInfo(InfoType a, Info b(;

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

这有什么意义吗,,,...

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

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

InfoType type = eHOME;
Info info;
info.OfficeInfo.xxx = xxx;
SetInfo(type, info);

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

这种

检查是可能的。 info本质上不是HomeOffice。 它是一个字节块,您可以选择将其解释为任何一个,因为它是一个联合。

这似乎根本不是工会的好用处。 相反,OfficeHome应该从共同的父母继承,比如Info。 那么SetInfo应该参考Info,喜欢这个:

void SetInfo(Info &myInfo);

而且您需要一些工厂方法,知道它是否需要传入 HomeOffice 的实例。

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

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功能非常简单:

void SetInfo(Info* info)
{
    if (info->type() == eHome)
    {
        HomeInfo* hi = (HomeInfo*)info;
        // ...
    }
    else if (info->type() == eOffice)
    {
        OfficeInfo* oi = (OfficeInfo*)info;
        // ...
    }
}