静的 int 配列であるクラス変数が必要なコードを書いています。ヘッダーファイルで次のようなものを使用してこれを実行できることを理解しています。ああ:
#ifndef A_H_
#define A_H_
class A
{
public:
static const int a[];
};
const int A::a[] = {1,2};
#endif
このヘッダーを他の 1 つのファイル (次の main.cpp のようなもの) にのみ含める場合、これは問題なく機能します。
#include "A.h"
#include <iostream>
using namespace std;
int main()
{
A myA;
cout << "0: " << myA.a[0] << endl;
cout << "1: " << myA.a[1] << endl;
}
しかし、クラス A をもう少し複雑にする必要があり、A.cpp ファイルも必要だとします。main.cpp ファイルは同じままにしますが、Ah を次のように変更します (関数 printA を追加しただけです)。
#ifndef A_H_
#define A_H_
class A
{
public:
void printA() const;
static const int a[];
};
const int A::a[] = {1,2};
#endif
そして、ファイル A.cpp で:
#include "A.h"
#include <iostream>
using namespace std;
void A::printA() const
{
cout << "Printing in A.cpp." << endl;
cout << "A.0: " << a[0] << endl;
cout << "A.1: " << a[1] << endl;
}
gcc -o Ao -c A.cpp で Ao をコンパイルしても問題ありません。しかし、main.cpp (gcc -o atest main.cpp Ao) をコンパイルするときにこれをリンクすると、「'A::a' の複数定義」で失敗します。
私は解決策を求めてインターネットを精査してきましたが、ヘッダーで宣言された変数を複数の場所に含めると「複数定義」エラーが発生する人を見つけました。解決策は、変数 extern をヘッダーを定義し、それを 1 つのソース (非ヘッダー) ソース ファイルでのみ定義します。しかし、クラス変数を static と extern の両方で宣言することはできませんよね? 試してみるか、単に extern を宣言すると、変数が静的ではないという警告が表示されます (両方を試すと、「競合する指定子」エラーも発生します)。
それで、私の質問: ヘッダー ファイルを複数のソース ファイルに含める必要がある場合、静的配列クラス変数を使用することは可能ですか? もしそうなら、どのように?