2014-03-06 188 views
0

有類:靜態聯方法無需靜態成員初始化

KH

class k 
{ 
    static int ii; 
    static void foo(); 
}; 

k.cpp

#include "k.h" 

void k::foo() 
{ 
    ii++; 
} 

在編譯我收到以下錯誤信息:

error LNK2001: unresolved external symbol "private: static int k::ii" ([email protected]@@0HA) 

這是確定的。但是,當我添加inline關鍵字的方法,錯誤消失:

class k 
{ 
    static int ii; 
    inline static void foo(); 
}; 

這不是現實世界的例子,但我不知道到底發生了什麼在此代碼,可能是有人向我解釋?

+0

凡'foo'使用? ii定義在哪裏? foo的定義在哪裏? –

+0

@Charles貝利FOO無處使用的,II無處定義,在CPP文件中定義FOO。但我已在下面的答案中得到解釋,看起來完全正確。 foo未使用,因此不會生成代碼。 – begezavr

回答

2

此代碼:

#include <iostream> 
using namespace std; 

struct k 
{ 
    static int ii; 
    static void foo(); 
}; 

void k::foo() { 
    ii=0; 
} 

int main() { 
    // your code goes here 
    return 0; 
} 

給出的連接錯誤,因爲函數K :: foo是由編譯器輸出,和它引用ķ:: II。

此代碼:

#include <iostream> 
using namespace std; 

struct k 
{ 
    static int ii; 
    inline static void foo(); 
}; 

inline void k::foo() { 
    ii=0; 
} 

int main() { 
    // your code goes here 
    return 0; 
} 

不給一個鏈接錯誤,因爲函數K :: foo的聲明爲內聯,而不是從任何地方調用,所以編譯器從來沒有真正產生任何代碼它。

如果添加其他內主,或任何一個電話到k :: foo的(),那麼你會得到一個鏈接錯誤。

+0

在C++中,你支付你使用的東西。 – rmi

+0

謝謝,聽起來合乎邏輯。 – begezavr