6

静的 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 を宣言すると、変数が静的ではないという警告が表示されます (両方を試すと、「競合する指定子」エラーも発生します)。

それで、私の質問: ヘッダー ファイルを複数のソース ファイルに含める必要がある場合、静的配列クラス変数を使用することは可能ですか? もしそうなら、どのように?

4

2 に答える 2

19

単一定義規則に違反しています。定義を実装ファイル内に移動します。

//A.cpp
#include "A.h"
const int A::a[] = {1,2};

を使用して参照しているソリューションはextern、非メンバー変数に適用されます。あなたの場合aはクラスのメンバーです。

于 2012-05-23T14:35:58.710 に答える
7

「const int A::a[] = {1,2};」を削除する必要があります。ヘッダファイルの行。この定義行を .cpp ファイルの 1 つに入れます。次に、必要な場所にヘッダー ファイルを数回含めることができます。

于 2012-05-23T14:45:37.703 に答える