3

https://stackoverflow.com/a/8839647/462608

静的初期化子を使用します。

public class MyClass
{
    static {
    //init
    }
}

C++で同様のことを行うことはできますか?
実際には、いくつかの変数を初期化する必要がありますが、オブジェクトを作成したくありません。

4

2 に答える 2

6

変数がstaticメンバーの場合、それらを初期化できるだけでなく、初期化する必要があります。

Java 初期化子リストに直接相当するものはありませんが、関数を呼び出して静的メンバーを初期化することで同様のことができます。

class X
{
    static bool x;
}

bool foo()
{
    //initialization code here
}

bool X::x = foo();

これは、論理が激しい場合に適しています。staticメンバーを初期化することだけが必要な場合は、 と同様に実行してくださいX::x

実際には、いくつかの変数を初期化する必要がありますが、オブジェクトを作成したくありません。

変数がクラス外にある場合は、それらを直接初期化します (そのためのコードを呼び出す必要はありません)。

変数がstaticクラスのメンバーである場合は、上記のアプローチのいずれかを使用します。

変数がstaticメンバーでない場合、それらはオブジェクトなしでは存在しません。

于 2012-09-25T12:42:06.620 に答える
1

クラスの静的変数は、.cpp ファイルで初期化されます。

MyClass.h

class MyClass {
public:
   static void f1();
   static void f2();
private:
   static int a1;
   static int a2;
   static int a3;
};

MyClass.cpp

   int MyClass::a1 = 7;
   int MyClass::a2 = 8;
   int MyClass::a3 = MyClass::a1 + MyClass::a2;

   void MyClass::f1()
   {
      a1 = 7;
   }
   void MyClass::f2()
   {
      cout << a2 << endl;
   }

静的メンバー変数の重要な初期化が必要な場合は、コンストラクターを使用して内部クラスにグループ化します。

MyClass.h

class MyClass {
public:
   static void f1();
   static void f2();
private:
   struct Data {
      Data();
      int a1;
      int a2;
      int a3;
   };
   static Data data;
};

MyClass.cpp

   MyClass::Data MyClass::data;
   MyClass::Data::Data() : a1(0), a2(0), a3(0)
   {
      // it is just an example ;)
      for (int i = 0; i < 7; ++i)
      {
         a1 += 2;
         s2 += 3;
         a3 += a1 + a2;
      }
   }

   void MyClass::f1()
   {
      data.a1 = 7;
   }
   void MyClass::f2()
   {
      cout << data.a2 << endl;
   }
于 2012-09-25T13:46:08.917 に答える