-2
CallingClass::CallingFunc()
{
    SomeClass obj;
    obj.Construct(*Singleton::GetInstance()); // passing the listener
    // Singleton::GetInstance() returns a static pointer.
    //Singleton is derived from IListener
}

SomeClass::Construct(const IListener &listener)
{
    IListener* pListener = const_cast<IListener*>(&listener);
}

const_cast pListenerはヌルです。そのような型キャストを実行することは可能ですか?

ありがとう

4

3 に答える 3

10

だから私に見させてください。2フェーズの初期化、シングルトン、およびキャストアウェイconstあり、オブジェクトのアドレスを再度取得するためだけにオブジェクトの参照を解除していますか?私の友人、迷いのNULLポインタはあなたの懸念の中で最も少ないものです。

それを捨てて、最初から書き直してください。そして、最初にC++の本を手に入れてください。

ご存知のとおり、const_castnullポインタが渡されない限り、nullポインタを生成することはできません。GetInstance()この動作を生成するために戻ってくる必要がありますNULL。これは、参照を解除するとすぐに正式にUBになります。

于 2012-08-08T12:14:54.233 に答える
1

const_castは基本的に、何かの定数を無視するようにコンパイラーに指示するものです。コンパイラの保護を無効にしているため、この使用は避けてください。読み取り専用メモリを更新しようとするものを作成すると、クラッシュが発生する可能性があります。

ただし、実際にはコードが生成されることはありません。

したがって、これが:

IListener* pListener = const_cast<IListener*>(&listener);

その結果、pListenerがNULLになり、&listenerがNULLになります。これは不可能です(または、シングルトンのnull参照を返すか、問題の説明から何かが欠落しています)。

私はDeadMGからの回答に強く同意します。

空のオブジェクトを作成し、そのオブジェクトに対してInitを実行する(2フェーズ構築)ことは避けてください。適切に作成されたオブジェクトは有効である必要がありますが、Initメソッドがある場合は有効ではありません。

何かから恒常性を取り除くことは避けなければなりません-それは驚くべき振る舞いを生み出す可能性が非常に高いです。

そのコードでの参照解除と再参照の量は、誰にとっても頭痛の種になります。

于 2012-08-08T12:47:35.360 に答える
0

2 つの質問:

  1. ここで何を達成しようとしていますか?
  2. コードをどの程度制御できますか? (つまり、何を変更できますか?)

意地悪をするつもりはありませんが、もう一度やり直したほうがいいかもしれません。このコードにはいくつかの問題があります。

まず、Singleton パターンは、特定のオブジェクトの 1 つだけが作成されることを保証する必要があるため、通常はポインター、参照、またはその派生物 (ブースト共有ポインターなど) によって返されます。ただし、必ずしも const である必要はありません。ここにあるのは、作成者がそれを const 以外の方法で使用することを意図していなかったことを示しています。

次に、このオブジェクトを参照によって関数に渡します。必要なし。これが、シングルトン パターンの主要な機能 (および欠点) の 1 つです。どこからでもアクセスできます。したがって、次のように簡単に書くことができます。

SomeClass::Construct()
{
    IListener* pListener = const_cast<IListener*>(*Singleton::GetInstance());
}

これはまだ本当に役に立ちませんが。それが行うことの1つは、インターフェースを少し明確にすることです。SomeClass::Construct(const IListener&listener)おわかりのように、誰かが書いたものを読んでいると、それが関数内でlistener扱われることを合理的に暗示する可能性があり、 を使用することで、その暗黙の契約を破ったことになります。これは、少なくともこのような状況では使用すべきではないという非常に正当な理由です。constconst_castconst_cast

自問する必要がある基本的な質問IListenerは、const の場合、なぜ const 内でそれを非 const の方法で使用する必要があるのか​​ということですConstructシングルトンが const オブジェクトを返さないか、関数が非 const である必要がないかのいずれかです。

これは設計上の問題であり、次の手順を実行する前に解決する必要があります。

于 2012-08-08T12:53:03.627 に答える