5

私は静的なint配列のクラス変数を持つ必要があるいくつかのコードを書いています。私は、ヘッダファイルに次のようなものでああ、これを行うことができることを理解する:静的配列クラスの変数 "多重定義" C++

#ifndef A_H_ 
#define A_H_ 

class A 
{ 
public: 
    static const int a[]; 
}; 

const int A::a[] = {1,2}; 

#endif 

私は、この一つだけ、他のファイルのヘッダー、次のようなもの、メイン含むてる場合、これはうまく動作します。 cpp:

しかし、クラスAがもっと複​​雑になる必要があるとします。私はA.cppファイルも持っていたいと思います。私は同じ私のmain.cppにファイルを保持しますが、次のように(私は機能、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をコンパイルするAo -c A.cppは問題ありません。しかし、main.cpp(gcc -o atest main.cpp A.o)をコンパイルするときにこれをリンクすると、 "A :: a 'の多重定義で失敗します。

私は解決策のためにインターネットを精練していましたが、ヘッダーに宣言された変数を持つ人が、複数の場所にヘッダーを含めると "多重定義"エラーが発生していました。ヘッダー内の変数externを作成し、ソース(非ヘッダー)ソースファイルでのみ定義します。しかし、私は静的と外部の両方のクラス変数を宣言することはできませんか?私が試してみると、あるいは私がexternを宣言しただけでは、変数が静的ではないという警告が出ます(両方を試してみると "競合する指定子"エラーです)。

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

答えて

17

あなたはの定義ルールに違反しています。実装ファイル内の定義を移動します:

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

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

7

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