2

C/C++ コードのプログラミングの専門家の皆様、こんにちは。
このコードに出くわしましたが、2 つの関数が何を返しているのか混乱しています。
親切な魂が私を助けてくれますか?
私はコードを可能な限り一般的で他の人にとって有用なものにしようとしました.

ClassA*& func1() {
    static ClassA* mClassA;
    return mClassA;
}

ClassA* func2() {
    ClassA*& mClassA = func1();
    if(!mClassA) {
        ... // omitted some code that fill mClassA with data.
    }
    return mClassA;
}

[編集] また質問したいのですが、func1() と func2() の *& は互いに打ち消し合っていますか?

4

4 に答える 4

4
ClassA*& func1()

参照によってメソッド内で宣言された静的ポインターを返します。やっている:

ClassA*& x = func1()
x = NULL

変わるでしょうmClassA

ClassA* func2()

ポインタのコピーを返します。同じメモリを指しますが、ポインタを変更しても影響はありませんmClassA

于 2012-09-07T09:32:39.917 に答える
1

一言で言えば:

  • func1シングルトンポインタを提供します。

  • func2実装デバイスとしてClassAからのシングルトンポインタを使用して、タイプのシングルトンオブジェクトを提供します。func1

次のように、同様の目標をよりエレガントに達成できます。

ClassA & getA()
{
    static ClassA impl = initialize_A();  // Or a lambda or just a constructor.
    return impl;
}

これにより、プログラムの最後に、手動で破棄することなく、正しい順序で実装インスタンスがクリーンアップされます。

于 2012-09-07T10:10:26.197 に答える
0

func1()ポインターへの参照を返します。実際には、これは、関数へのコピーではなく、関数内で使用されているのと同じポインターを返すことを意味します。このように、ポインターの値を変更すると (ポインターが指すオブジェクトの値を変更するのではなく)、関数内のポインターの値を実際に変更します。

これがfunc2()正しく機能する理由です。mClassA内部の静的ポインターへの参照をfunc1()取得し、必要に応じてその値を更新してから、ポインターのコピーを返します。これは、 と同じアドレスを指すポインタmClassAです。

于 2012-09-07T09:37:06.463 に答える
0
ClassA*& func1() {
    static ClassA* mClassA;
    return mClassA;
}

func1()Meyer のシングルトンのようなものです。これは、グローバル ポインターの作成に似ています。したがって、この関数はポインター「オブジェクト」を作成し、それへの完全なアクセスを提供します。つまり、次のようなことができます。

func1() = new ClassA;

func2()ポインタのコピーを返すだけです。つまり、上記のように*変更することはできません。

※placement newを使用することで、指すオブジェクトを変更することが可能です。

于 2012-09-07T09:58:38.597 に答える