2

静的変数 (メソッド内で宣言されている) への参照を返す静的メソッドを持つクラスを作成したいと考えています。私が欲しいのは、メソッドを呼び出して静的変数の参照を取得するときです。次に、クラスの外でそれを変更し、メソッドを再度呼び出して、以前に設定したのと同じ値を取得します。

これが私が試したことです:

#include <iostream>
using namespace std;

class A
{
public:
    static int& f()
    {
        static int i;
        return i;
    }
};

int main()
{
    static int i;
    i = A::f();

    cout << i << endl;

    i = 11;
    cout << i << endl;

    i = A::f();
    cout << i << endl;

    return 0;
}

問題は、このコードの出力が次のようになることです。

0
11
0
Press <RETURN> to close this window...

なぜ戻らないのですか0, 11, 11、どうすれば戻せ0, 11, 11ますか?

注:静的変数は、メンバーとしてではなく、メソッド内で明示的に宣言する必要があります。

ありがとう!

4

4 に答える 4

6

これは、参照によって返された値を通常の変数にコピーするためです。 に格納int&するとint、それは参照ではなくなります。

代わりにすべきことは

int &i = A::f();

ローカルであるi必要はないことに注意してくださいstatic。静的データへの参照は、問題なく自動変数に格納できます。

于 2013-01-25T14:25:41.360 に答える
4

ローカル変数iが関数内の同じ変数を参照するようにするには、それを参照として宣言します。

static int& i = A::f();

それ以外の場合は、新しい変数を作成して代入A::f()を使用しているだけです。

于 2013-01-25T14:25:19.353 に答える
4

の戻り値によって参照される int への変更を変更する場合は、 int&inである必要があります。mainintf

于 2013-01-25T14:25:52.140 に答える
2

変数を初期化したい場合があります。また、それを直接使用することも、ローカル参照で参照を「保存」することもできます。ただし、これらのローカル参照を再署名することはできません。例えば:

int main()
{
    A::f()=3;
    cout << A::f() << endl;

    static int &i = A::f();
    cout << i << endl;

    i = 11;
    cout << i << endl;

    cout << A::f() << endl;

    int &ii = A::f();
    cout << ii << endl;

    return 0;
}
于 2013-01-25T14:31:57.610 に答える