簡體   English   中英

如何在CPP中解析工會中的結構?

[英]How to parse a structure in a union in CPP?

我有一個聯合和枚舉,例如:

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之后是否可以檢查結構是什么?

我不確定您要在這里實現什么,但是這種方法幾乎肯定是錯誤的。 我建議在這里使用繼承:

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

void SetInfo(InfoType a,Info b);

也許您可以將&b強制轉換為Home *,然后將Home和Office的第一個“類變量”硬編碼為一個char,您可以檢測到該char並使用特定值對其進行初始化以便於檢測。

這有道理嗎,,,...

在這種情況下,您應確保在每次SetInfo調用中Info和InfoType都一致。

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

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

基本上,作為一個聯合,如果沒有這兩種類型的進一步信息,則無法區分info是OfficeInfo還是HomeInfo。

這種檢查是可能的。 info本質上不是HomeOffice 它是一個字節塊,您可以選擇將其解釋為一個字節,因為它是一個聯合。

這似乎根本不是一個工會的好用處。 Info表示, OfficeHome應該從同一個父級繼承。 然后SetInfo應該引用Info ,如下所示:

void SetInfo(Info &myInfo);

並且您將需要一些工廠方法來知道它是否需要傳入HomeOffice實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM