-1

フィールドとしてunionを含むクラスがあります。和集合は、2つの異なるクラスへのポインタです。2番目のフィールドとして、私のクラスには、現在どのタイプが格納されているかを通知するフラグが含まれています。

class Item {
    std::string *title;
    bool who_am_I;
    union { Submenu *smenu; Function *call; } content;
    public:
    bool am_I_a_submenu();
    bool am_I_a_function();
    Submenu *give_me_submenu();
    Function *give_me_function();
    /*(...)*/
};

ここで、「give_me」メソッドを使用する前に、フラグにアクセスする適切なメソッド、つまり「am_I」メソッドを使用してタイプを確認するようにユーザーに促します。それでも、ユーザーがたまたまそれを忘れてしまった場合は、ライブラリに適切な例外をスローさせたいと思います。「give_me」メソッド内のフラグをチェックせずにそれを行うことはできますか?通常の使用ではフラグが不必要に2回チェックされることを意味するので、私は尋ねます。

タイプの競合が発生してプログラムの誤動作が発生した場合、C ++がビルド例外をスローするかどうか、いつスローするのか疑問に思いました。または、フラグを再確認せずに、このケースを別の方法で処理する必要があるかもしれません。

4

3 に答える 3

4

OK、まず第一に...フラグが2回チェックされても気にするのはなぜですか?これは、プロファイリングが最適化する必要があることを示している、製品の深刻なパフォーマンスのボトルネックですか?私はそれを非常に疑っています。

しかし、それがパフォーマンスのボトルネックであるとしても、何がより重要なのでしょうか。クラッシュしない適切に機能するアプリケーションは、ごくわずかな余分なオーバーヘッドとのトレードオフとして受け入れられるように思えます。

ただし、ユーザーが自分の持っているものを常に把握し、このような間違いを犯さないように、インターフェイスを再設計する必要があります。

于 2013-01-23T23:41:56.443 に答える
1

ユニオン内に何が保存されているかを確認する方法はありません。ユニオンを使用する場合は、常に適切な要素にアクセスしていることを確認する必要があります。間違ったものを読み取ることは未定義の動作であり、例外をスローしません。

何をしているのかわかりませんが、全く使わないことをお勧めunionします。これは、メモリを節約するための昔ながらの方法であり、発生する可能性のあるバグの価値はありません。あなたの場合、それはメモリをまったく節約しません(前のブール値は、メモリの整列のために、ポインタと同じくらい多くのメモリを消費します)。

于 2013-01-23T23:41:48.417 に答える
0

ユニオンを使用することにより、2つのタイプに互換性があることをコンパイラーに通知します。通常、2つから変換すると、ユーザー指定の変換もデフォルトの変換もないため、コンパイル時の問題が発生しますが、ユニオンとして定義したため、両方のタイプへのデフォルトの変換があります。

この場合、ブール値をチェックするための追加の呼び出しはおそらくそれほど高価ではないと仮定します。

于 2013-01-23T23:39:23.507 に答える