【问题标题】:How to parse a structure in a union in CPP?如何在 CPP 中解析联合中的结构?
【发布时间】:2012-02-10 14:01:12
【问题描述】:

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

typedef union{
    Home   HomeInfo;        
    Office OfficeInfo;          
} Info;

typedef enum{                               
    eHOME,  
    eOFFICE

} InfoType;

HomeOffice 是其他结构。

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

void SetInfo(InfoType, Info);

在函数调用过程中,如果InfoTypeeHOME,我会创建一个Info 对象Info info; 并填写HomeInfo 详细信息info.HomeInfo 并调用

SetInfo(eHONE, info);

SetInfo 定义:

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检查后是否可以检查结构是什么?

【问题讨论】:

  • 我读了你的问题大约三遍,但我仍然无法理解它......你能创建一个自包含的简单示例,其中包含一些输入的预期输出以突出问题吗?

标签: c++ c function structure unions


【解决方案1】:

void SetInfo(InfoType a, Info b);

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

这有意义吗,,,...

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      这对于工会来说似乎不是一个很好的用途。而OfficeHome 应该从一个共同的父级继承,比如Info。那么SetInfo 应该引用Info, 像这样:

      void SetInfo(Info &myInfo);
      

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

      【讨论】:

        【解决方案4】:

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

        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;
                // ...
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-14
          • 2019-06-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多