フィールドとして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 ++がビルド例外をスローするかどうか、いつスローするのか疑問に思いました。または、フラグを再確認せずに、このケースを別の方法で処理する必要があるかもしれません。