0

正直に言うと、私が聞きたい質問がいくつかありますが、それらを行うために使用する質問は1つだけです。

私が見たところ、静的関数はクラスオブジェクトを作成しなくても外部からアクセスできるため、これらの関数はプログラムの初期化時に作成されたデフォルトのコピーからのものであると思います。クラスに通常1回使用するためのプライベートコンストラクタがあり、既知のメソッドGetInstanceが使用される場合、ポインタが指す静的変数のアドレスが返されます。問題は、何度も呼び出すことができるということですがGetInstance、ポインタが指すアドレスは常に同じです。なぜこれが発生するのか、次に、それと直接静的関数の違いは何ですか?の「COPY」が作成され(上記の質問を参照)、関数にポインタがあり、静的関数に静的関数がないのはなぜかという質問につながるため、ベクトルGetInstanceにアクセスできることを知っています。storageStoreBthisthisポインタ、コピーが作成されないため?

class store
{
private:
    store(){};
    ~store(){};

    std::vector<int>storage;
public:

    static void Store( int a );
    void StoreB( int a );

    static store* GetInstance()
    {
        static store obj;
        return& obj;
    }
};

void store::StoreB( int a )
{
    storage.push_back( a );
}

void store::Store( int a )
{
    //storage.push_back( a ); //can't

}

int _tmain(int argc, _TCHAR* argv[])
{
    store::Store( 2 );
    store::GetInstance()->Store( 3  );

    store *a = store::GetInstance();
    store *b = store::GetInstance(); 

    cout << a << endl //points to the same address
        << b << endl; //points to the same address


}
4

4 に答える 4

3

あなたの仮定には欠陥があります。静的関数は、プログラムの初期化時に作成されたプライベートのデフォルトコピーを使用しません。彼らは単にコピーをまったく使用しません。静的関数は、事実上、クラスの静的メンバーおよびネストされた型にアクセスできる名前付き関数です。thisクラスのインスタンスがまったくないので、ポインタがないと言うときは正しいです。

実際、動作を変更することなく、静的メソッドをグローバル関数として実装できます。それをクラスから引き出し、クラスのフレンドとしてマークしてから、クラス名前空間修飾子(eg store::)を使用して、静的メンバー/ネストされた型へのアクセスを修飾します。


に関する質問についてGetInstance()は、静的変数を使用しているため、常に同じポインタが返されます。静的変数は基本的にグローバルであり、ローカルスコープ内でのみ表示されます。したがって、同じ静的変数へのアクセスは常に同じ値になります。

これはシングルトンパターンと呼ばれます。

于 2012-09-11T21:08:55.767 に答える
3

静的、メンバー、または無料の関数は作成されません。それらはすべて、プログラムの一部として常に存在します。オブジェクトの作成時にそれらが存在することはありません。それがあなたの最大の誤解のようです。

于 2012-09-11T21:14:05.950 に答える
1

シングルトンパターンに出くわしました。クラスの単一のインスタンスはプログラムを介して許可され、メソッドstoreを介してアクセスできます。GetInstance()オブジェクトstatic store obj;は一度だけ初期化され、を呼び出すたびにオブジェクトへのポインタが返されますGetInstance()

コピーが作成されないため、静的関数にthisポインターがないのはなぜですか?

それらはクラスのインスタンスに関連付けられていないためです。

GetInstanceは何度も呼び出すことができますが、ポインタが指すアドレスは常に同じです。なぜこれが発生するのでしょうか。

すでに説明しましたが、それは同じオブジェクトです。

そして第二に、それと直接静的関数の違いは何ですか?

直接静的関数のようなものはありません。

于 2012-09-11T21:09:32.660 に答える
1

静的関数はthisインスタンス変数にアクセスできないため、ポインターがありません。そもそも静的であると宣言したのはそのためです(OOの文献では、C ++の静的関数はクラス関数と呼ばれることがよくあります)。

同じポインタが返される理由はGetInstance、メソッド内の変数がポインタを静的ストレージに格納するためです。

static store obj;

これは、メソッドのすべての呼び出しが同じ値を取得することを意味します。

また、インスタンス関数を呼び出すときに発生するコピーについても間違っています。ポインタthisはオブジェクト自体を指しているため、行った変更storageは実際のオブジェクトに対して実行されます。

于 2012-09-11T21:10:52.743 に答える