このコードを考えてみましょう:
#include<iostream>
using namespace std;
class Wilma
{
public:
static int i;
Wilma()
{
cout<<"\nWilma ctor\n";
cout<<"\ni::"<<i<<"\n";
}
};
class Fred
{
public:
Fred()
{
cout<<"\nFred ctor\n";
}
static Wilma wilma_;
};
int Wilma::i=44;//------------- LINE A
int main()
{
int a=0;
Wilma::i=a;//---------- LINE C
Wilma w;
Fred::wilma_=w;//---------- LINE B
}
ここで、行AはWilmaクラスの静的int aを明示的に定義し(リンカーエラーを引き起こすためにコメントアウトされています)、それがないとリンカーは未定義の参照エラーを出します(Wilma :: iが実際に使用されているため、使用しない場合はリンカーエラーはありません)ある。)
Fredクラスの静的Wilmawilma_についても同じことが言えます。つまり、B行のコードでも使用されているため、明示的に定義する必要があります。ただし、そうではない場合、Fred::wilma_のリンカーエラーはありません。明示的に定義されていません。なぜ?gcc4.5.2でテスト済み
編集: 私はどういうわけかこれについて別の疑問を持っています...
LINECとLINEBint Wilma::i
はどちらも、それぞれクラスの静的オブジェクトを使用しようとしていますWilma Fred::wilma_
。しかし、の定義だけint Wilma::i
が必須ですか?
なぜWilma Fred::wilma_;
必須ではないのですか?
行Bはノーオペレーションであるという答えを理解しています。でもC線についても同じことが言えますか?