-2

静的関数を持つクラスがあるとしましょう。この関数は、クラス オブジェクトをインスタンス化せずに、コードの別の部分によって static として呼び出されます。ただし、この静的関数のコードには、変数 x への依存も含まれています。ただし、x は特定の値に初期化されるか、コンストラクターでクリアされるだけです。しかし、クラスのオブジェクトがインスタンス化されていないことを考えると、変数は未定義であると思います。それで、いくつか質問があります:

1)コンストラクターはまったく呼び出されていますか?

2) 変数 x は未定義ですか?

そのようなケースを回避するにはどうすればよいですか?

以下の例では、y を 25 にしたいのですが、それは可能なのでしょうか?

class CExample
{
public:

    CExample(void);
    ~CExample(void);
    static void foo();

    int x;
};

CExample::CExample()
{
    x = 5;
}


void CExample::foo()
{
    int y = x*5;

}
4

4 に答える 4

2

これは悪いデザインの場合のように見えます。xを静的にし、5で初期化することでコンパイルされるように修正できます。ただし、設計と実行したいことを再考する方がはるかに優れていると思われます。静的なもののインスタンスは1つだけですが、CExampleのインスタンスは、コンストラクターと呼ぶ回数と同じ数であることに注意してください。

于 2013-01-08T21:34:43.997 に答える
2

静的関数は、クラスによってインスタンス化されたオブジェクトにのみ存在する変数を使用しているため、コードはコンパイルされません。

あなたが静的を理解しているかどうかはわかりません。静的関数は1 つだけ存在します。どこからでも呼び出すことができます。CExample の x が使用することになっている場合、どのインスタンスを使用しますか?

于 2013-01-08T21:30:42.400 に答える
1

静的メンバー関数は、クラスの特定のオブジェクトではなく、クラスのサービスです。クラスの静的データメンバーと静的メンバー関数は、そのクラスのオブジェクトのインスタンス化とは独立して存在します。

静的関数を使用しても、それぞれのクラスのコンストラクターは呼び出されないため、変数は存在せず、コンパイルエラーが発生します。

静的メンバー関数が存在し、クラスのオブジェクトとは独立して動作することを覚えておいてください。

于 2013-01-08T21:34:14.103 に答える
0

静的関数から非静的メンバーにアクセスすることは違法です。プログラムをコンパイルしようとすると、gcc の出力が表示されます。

test.cpp: In static member function ‘static void CExample::foo()’:
test.cpp:9: error: invalid use of member ‘CExample::x’ in static member function
于 2013-01-08T21:32:51.850 に答える