4

すべての静的メソッドを使用してクラスの静的メンバーにアクセスするにはどうすればよいですか?

関連する関数のグループが必要ですが、これらの関数のいずれかが呼び出される前に、いくつかの重要なデータメンバーも初期化されます。静的なメンバーだけのクラスが行く方法だと思いました。VS2008のコンパイラは、私が「a」にアクセスしようとするのを嫌います。

確かに私は何か小さなものが欠けていますが、それでも非常に混乱しています。:P( "a"の無効なアクセスがなくても、mainからtestMethod()を呼び出すときにコンストラクターは呼び出されません。

class IPAddressResolver
{
private:

public:
    static int a;
    IPAddressResolver();
    static void TestMethod();
};


IPAddressResolver::IPAddressResolver()
{
    IPAddressResolver::a = 0;
    cout << "Creating IPAddressResolver" << endl;
}

void IPAddressResolver::TestMethod()
{
    cout << "testMethod" << endl;
}
4

3 に答える 3

11

関数の外部で静的データメンバーを定義する必要があります。

class IPAddressResolver
{
private:
    static int a;
    IPAddressResolver();
public:
    static void TestMethod();
};

int IPAddressResolver::a = 0;

void IPAddressResolver::TestMethod()
{
    cout << "testMethod" << endl;
}

クラスの新しいインスタンスを作成しないため、コンストラクターは呼び出されません。静的ユーティリティクラスの場合、インスタンスは必要ないため、コンストラクタを完全に省略できます。privateまたは、クラスがインスタンス化されないことを明示するために宣言することもできます(上記を参照)。

ノート:

  • publicクラスでフィールドを使用することはお勧めしません。そのため、私はになりaましたprivate
  • 静的ユーティリティクラスは通常ステートレスであるため、クラス内にフィールドが必要な場合、これはクラスがシングルトンである方がよいことを示している可能性があります。
于 2010-06-07T20:36:29.493 に答える
2

クラス定義の外のどこかで、そのクラスに関連付けられた静的データメンバーを定義して初期化する必要があります。

最も簡単なのは置くだけです

int IPAddressResolver::a = 0;

IPAddressResolver.cppファイルにあります。

于 2010-06-07T20:42:11.757 に答える
2

関連する関数のグループが必要ですが、これらの関数のいずれかが呼び出される前に、いくつかの重要なデータメンバーも初期化されます

静的メンバーだけのクラスではなく、シングルトンが必要なように思えます。

于 2010-06-07T20:42:34.110 に答える