3

Instance 関数 (クラスのシングルトン インスタンスを返す関数) がオーバーロードされているシングルトン クラスがあるとします。1 つのバージョンはいくつかのパラメーターを取り、クラス コンストラクターでオブジェクトの初期化を行います。もう 1 つのバージョンはパラメーターを取りません。

1.    myClass::Instance ( int x, int y );
2.    myClass::Instance ( );

私たちが達成したいことは、クラスのユーザーが常に最初に (1) を呼び出す必要があり、その後の呼び出しは (2) に対してのみ行う必要があるということです。ユーザーは (2) への最初の呼び出しを許可されるべきではなく、(1) への呼び出しが行われると、(1) への後続の呼び出しは許可されません。

クラスのユーザーに NULL ポインターをチェックする負担をかけずにこれを達成することは可能ですか?

4

3 に答える 3

3

問題は、コンパイル時にこの「最初の呼び出し」概念をコンパイラーに調停させることができないことです (コンパイラーは特定の翻訳単位をコンパイルするため、(1) が他の翻訳単位から呼び出される可能性があるかどうかについての洞察がありません)。 、したがって、次のことを行う必要があります。

  • コンパイル時に一方または両方のオーバーロードへのアクセスを制限する設計、および/または
  • 実行時に有効な使用法を確認する、および/または
  • 必要な動作が確実に得られるようにしながら、(1) への複数回の呼び出しに対するコードの許容度を高めます。

十分であるかどうかにかかわらず、多くの可能なアプローチがあります。

  • (1)それを保護するか、それを呼び出す特定のコードに友情を与えながら非公開にすることでアクセスを難しくし、(2)コードの他の部分による便利な継続的な使用のために公開のままにすることができます

  • (1) のコードを記述して、最初に引数を無視して (2) を呼び出すようにすることができます。

  • 実行時に使用法を検証するアサーションを持つことができます。これにより、クライアント コードが本番環境に入るずっと前に、条件に準拠していることを確認できます。

  • (1) (2) を呼び出すために必要な何かを返すことができます。たとえば、クライアントが作成できない型のオブジェクトなどです。ただし、それだけでは (1) の再呼び出しが妨げられません。その必要なオブジェクトは (2) のコンストラクターに渡されるか、(2) そのオブジェクトの関数になる可能性があります。

于 2013-06-26T07:53:23.783 に答える
2

1. インスタンスが既に存在する場合は、例外をスローします (たとえば、std::logic_error)。そうでない場合は、提供されたパラメーターを使用してインスタンスを構築し、それを返します。

2. インスタンスがまだ存在しない場合は、例外をスローします (たとえば、std::logic_error)。それからあなたはそれを返します。

于 2013-06-26T07:50:45.427 に答える