2012-02-10 12 views
1

私は例えばのための労働組合や列挙型、持っている:CPPで組合の構造を解析する方法は?

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

typedef enum{        
    eHOME, 
    eOFFICE 

} InfoType; 

HomeOfficeは、他の構造体です。

私はInfoTypeeHOMEであれば、私は情報、Info info;のオブジェクトを作成し、HomeInfo詳細info.HomeInfoを埋めると呼んで、そのプロトタイプ関数呼び出しの際

void SetInfo(InfoType, Info); 

ある別の機能を持っている

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 
     } 
} 

eHOMEInfoTypeとし、詳細をOfficeInfoとして渡すと、無効な場合がありますか?現時点ではHomeInfoの詳細を取得していましたが、そこにはジャンク値があるため、エラーは発生しません。 InfoTypeチェック後の構造を確認することは可能ですか?

+0

私は約3回あなたの質問を読んで、私はまだそれを理解することはできません...あなたは問題を強調するいくつかの入力のための期待される出力を持つ自己完結型の簡単な例を作成できますか? – Nim

+1

CまたはC++を使用していますか? –

答えて

0

ここで達成しようとしていることはわかりませんが、このアプローチは間違いです。私はここinheritationを使用することをお勧め:

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

無効SETINFO情報(インフォタイプ、インフォB);

& bをHome *にキャストして、ホームとオフィスの最初の「クラス変数」を検出して特定の値で初期化して検出しやすくすることができます。

が、これは何の意味も,,, ...この場合

0

、あなたは情報とのInfoTypeがSETINFOのすべての呼び出しで一貫していることを確認する必要がありますありません。 2種類のさらなる情報なしに、

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

基本的には、労働組合として、あなたは情報がOfficeInfoかHomeInfoであるかを区別することはできません。

あなたは、たとえば、一貫性のない情報とのInfoTypeでSETINFOを呼び出すことを意図している場合。

0

このようなチェックが可能です。 infoは、本質的にHomeまたはOfficeではありません。これは、バイトであり、どちらかとして解釈することができます。これは、ユニオンであるためです。

これは、組合にとってはまったく役に立たないようです。代わりにOfficeHomeは共通の親から継承する必要があります。例:Infoその後SetInfoは、Infoへの参照を取るこのような 必要があります。

void SetInfo(Info &myInfo); 

そして、あなたはそれがHomeOfficeのインスタンスに渡す必要があるかどうかを知っているいくつかのファクトリメソッドが必要になります。

関連する問題