2011-01-15 14 views
5

私はクラスに静的変数を持っています。 私はそれをグローバルスコープで初期化していますが、その動作は問題ありません。メイン内の静的クラス変数の初期化

ただし、 メインリンカーで初期化しようとするとエラーが発生します。 なぜそうですか。

class Myclass{ 

    static int iCount; 
} ; 

int main(){ 

    int Myclass::iCount=1; 

} 

とグローバルスコープで

は、なぜ私は私がなぜない整数型としてICOUNTをdefinigています私のクラスのように

int Myclass::iCount=1; 

のように変数の型 を指定する必要があります。

Myclass::iCount =1 ; in //Global scope 
+0

@goreSplatter: 'Myclass :: iCount'は公開されていないため、失敗します。 – peoro

+0

@goreSplatter:@peoroが何を言ったのですが、それが公開されていても、それは*割り当てではなく*初期化* – Clifford

+0

@peoro:*プライベート静的データメンバーの初期化*は失敗しません! * assignment *のような他のアクセスは失敗します。 – Nawaz

答えて

5

C++標準のセクション$ 9.4.2/7が言う、

静的データメンバはは、 を初期化し、正確に非ローカル オブジェクト(3.6.2のようなを破壊しています3.6.3)。

「まさに非ローカルオブジェクトのように」「初期化」のフレーズ。あなたがなぜそれをすることができないのかを説明する希望。

実際、静的メンバーは、Myclass::iCountでアクセスするグローバルオブジェクトのようになります。だから、あなたはこのように、グローバルスコープ(クラスが定義されているのと同じ範囲)でそれらを初期化するためにきました:

class Myclass{ 

    static int iCount; 
} ; 
int Myclass::iCount=1; 

int main(){ 
    /*** use Myclass::iCount here ****/ 
} 

同様のトピック:

How do static member variables affect object size?

3

これはC++構文では許可されていないためです。静的変数を関数のスコープ外でインスタンス化する必要があります。

さらに、クラス終了括弧の後にセミコロン;を忘れてしまいます。

3

これは正しいC++です。 cppファイル内の関数の外側。実行ファイルの開始/起動時に初期化が行われます。 (main()を呼び出す前から)。

//main.h 

class Myclass{ 

    static int iCount; 
}; // and don't forget this ";" after a class declaration 


//main.cpp 

int Myclass::iCount=1; 

int main(){ 



} 
1

静的初期化の前を発生 mainは、実行時の初期化によって呼び出されます。

ローカルスコープのオブジェクトが宣言されているため、関数内に配置することはできません。それを許すのは混乱し、あいまいです。

2

C++標準(§8。5/10):

An initializer for a static member is in the scope of the member’s class.

クラスMyclassはグローバルスコープを持って、あなたは、より狭い範囲でその静的メンバを初期化しようとした - 機能mainの。

関連する問題