147

非常に簡単に言えば:

ほとんどが static public メンバーで構成されるクラスがあるため、他のクラス/関数から呼び出す必要がある同様の関数をグループ化できます。

とにかく、クラスのパブリック スコープで 2 つの static unsigned char 変数を定義しました。同じクラスのコンストラクターでこれらの値を変更しようとすると、コンパイル時に「未解決の外部シンボル」エラーが発生します。

class test 
{
public:
    static unsigned char X;
    static unsigned char Y;

    ...

    test();
};

test::test() 
{
    X = 1;
    Y = 2;
}

私はC++が初めてなので、簡単にやってください。なぜ私はこれを行うことができないのですか?

4

6 に答える 6

166

C++ 17を使用している場合は、指定子を使用できinlineます ( https://stackoverflow.com/a/11711082/55721を参照) 。


古いバージョンの C++ 標準を使用している場合は、X および Y の宣言と一致するように定義を追加する必要があります。

unsigned char test::X;
unsigned char test::Y;

どこか。静的メンバーも初期化することができます

unsigned char test::X = 4;

繰り返しますが、宣言(多くの場合.Hファイルにあります)ではなく、定義(通常はCXXファイル)でそれを行います

于 2008-10-12T07:49:10.860 に答える
72

クラス宣言の静的データメンバー宣言は、それらの定義ではありません。それらを定義するには、.CPPシンボルの重複を避けるためにファイルでこれを行う必要があります。

宣言および定義できるデータは、整数の静的定数のみです。(の値はenums定数値としても使用できます)

コードを次のように書き直すことをお勧めします。

class test {
public:
  const static unsigned char X = 1;
  const static unsigned char Y = 2;
  ...
  test();
};

test::test() {
}

静的変数を変更する機能が必要な場合(つまり、静的変数をconstとして宣言することが不適切な場合)、次の方法でコード.Hを分離できます。.CPP

.H:

class test {
public:

  static unsigned char X;
  static unsigned char Y;

  ...

  test();
};

.CPP:

unsigned char test::X = 1;
unsigned char test::Y = 2;

test::test()
{
  // constructor is empty.
  // We don't initialize static data member here, 
  // because static data initialization will happen on every constructor call.
}
于 2008-10-12T08:26:29.757 に答える