7

以下のようなクラスと指定された共用体が与えられた場合、どのように共用体を正しい値に初期化しますか?

ここで試みられているのは、クラスのコア データ型の 1 つとして 2 つ以上の異なる型を使用することです。void* を使用する代わりに、型が事前にわかっている場合、使用される型の共用体が構築されます。問題は、クラスがインスタンス化されるときに正しい共用体メンバーを初期化する方法です。型はポリモーフィックではないため、通常の継承モデルは適切ではないように思われました。正しい共用体メンバーを初期化するいくつかの素朴な試みは、どこにも行きませんでした。

union Union {
   int n;
   char *sz;
};

class Class {
   public:
   Class( int n ): d( 1.0 ), u( n ) {}
   Class( char *sz ): d( 2.0 ), u( sz ) {}
   ....
   double d;
   Union u;
};

解決策を精査した後、答えが明らかになり、この回答のリポジトリの適切な解決策になる可能性があるため、以下に含めます.

4

1 に答える 1

9

コンストラクターを持たない型については、共用体で初期化できることがわかります。ユニオン初期化子に関するこの回答は、解決策のヒントを提供します。

union Union {
   int n;
   char *sz;
   Union( int n ): n( n ) {}
   Union( char *sz ): sz( sz ) {}
};

今では期待どおりに動作します。あなたが何を探すべきかを知っていれば、明らかです。

編集:クラスコンストラクターの共用体で使用される型に注意することもできます。通常は int などを使用します。

于 2011-03-11T02:14:58.243 に答える