2011-06-06 124 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中的奇怪錯誤?

cpplearningconsole.obj:錯誤LNK2001 :解析外部符號 「市民:靜態INT一:: c「(?c @ a @@ 2HA)

我想這是一個編譯器錯誤。 對我來說,真正的問題是。應該mod能夠修改c變量,如果它是常量?

謝謝。

+3

這不是一個編譯器錯誤...你已經聲明瞭靜態成員'c',但沒有在任何地方定義它。 – forsvarir 2011-06-06 11:46:35

+0

'mod'可以是'const'並且改變'c'的值,因爲'c'不是實例的成員(因爲它是靜態的)'mod'被調用,所以實例不會改變。 – forsvarir 2011-06-06 11:53:27

+0

mod是在類中定義的,還有b,爲什麼不是c?這裏的邏輯在哪裏? – Aftershock 2011-06-06 11:57:33

回答

8

你剛纔宣佈在類定義靜態變量,你需要定義它在做int a::c = 0;

+1

事實上,這個錯誤與成員函數是'const'沒有任何關係,而且它當然不是編譯器錯誤。 – Jesper 2011-06-06 11:55:45

1

您應該爲您的變量成員添加正確的定義,在您只有聲明的類中。在你的CPP或只是類的聲明(在它之外)之後添加:

int a::c = 0;

3

此:

cpplearningconsole.obj:錯誤LNK2001:無法解析的外部符號「公用:靜態INT一: :c「(?c @ a @@ 2HA)

不是編譯器消息,它是鏈接器消息。你明白了,因爲雖然你已經聲明瞭成員c,但你還沒有定義它。靜態成員只需要在一個源文件中定義,以便創建它們。喜歡的東西:

int a::c = 0; 

關於你的第二個問題,聲明功能const,指出它不會修改它被稱爲上的對象。你不修改對象,它修改靜態成員。這就是爲什麼你沒有得到編譯器錯誤。

0

爲了回答您的其他問題:

c是你的類的公共靜態成員。 任何人都可以改變它的值,那麼爲什麼不可以mod()