2011-06-06 5 views
0
class a{ 
public: 
    int b; 
    static int c; 
    virtual void mod() const 
    { 
     c=4; 
    } 

}; 



int _tmain(int argc, _TCHAR* argv[]) 
{ 
    a bi; 

    return 0; 
} 

ルックは...のVisual Studio C++ 2010コンパイラを使用して、それをコンパイルした後、私は...C++のConstプロシージャ、Visual Studio C++ 2010の異常なエラー?エラー LNK2001:未解決の外部シンボル 「パブリック:静的int型Aこの時

cpplearningconsole.objを取得します:: c "(?c @ a @ 2HA)

これはコンパイラのバグだと思う。 私にとって、本当の疑問はです。 modはconstであればc変数を変更できますか?

ありがとうございました。

+3

これはコンパイラのバグではありません...静的メンバー 'c'を宣言しましたが、どこにも定義されていません。 – forsvarir

+0

'mod'は' const'で 'c'の値を変更することができます。' c'は 'mod'が呼び出されるインスタンスのメンバではないため(静的なので)、インスタンスは変更されません。 – forsvarir

+0

modはクラスで定義されているだけでなく、b、なぜnot cですか?この中のロジックはどこですか? – Aftershock

答えて

8

あなただけクラス定義のstatic変数を宣言している、あなたはint a::c = 0;を行うことによって、それにを定義する必要があります。

+1

確かに、エラーは、メンバー関数が 'const'であることとは何の関係もなく、コンパイラのバグではありません。 – Jesper

1

変数メンバーの正しい定義を、宣言のみのクラスに追加する必要があります。あなたのcpp Inまたは(それ以外)クラス宣言を追加した直後に:

int a::c = 0;

3

この:

cpplearningconsole.obj:エラーLNK2001:未解決の外部シンボル「パブリック:int型の静的: :c "(?c @ a @ 2HA)

コンパイラメッセージではなく、リンカメッセージです。あなたはメンバーcを宣言しましたが、定義していないので、あなたはそれを取得しています。静的メンバーは、作成するために1つのソースファイルでのみ定義する必要があります。ような何か:

あなたの2番目の質問については
int a::c = 0; 

は、constとして関数を宣言、それはそれが呼び出されていますというオブジェクトを変更しないと述べています。 mod関数はオブジェクトを変更せず、静的メンバーを変更します。だからあなたはコンパイルエラーを取得しません。あなたの他の質問に答えるために

0

cは、クラスのパブリック静的メンバーです。 誰でもはその値を変更することができます。なぜ、mod()

関連する問題