2011-02-02 84 views
2
class Base 
{ 
private: 
    static int num; 
public: 
    friend void setnum(Base obj); 
}; 

void setnum(Base obj) 
{ 
    obj.num=4; /* Error */ 
} 

朋友函數應該可以訪問一個類的所有私有數據。我在這裏錯過了什麼?我似乎無法訪問朋友功能的靜態變量。訪問朋友函數的靜態變量

從鍵盤錯誤 - >在功能 setnum(Base)': undefined reference to 基地:: NUM」從Visual Studio

錯誤 - >錯誤LNK2001: 解析的外部符號 「私人: 靜態INT基準:: NUM」

+0

該類存在於cpp文件中。它只是一個基本的代碼位。 – 2011-02-03 03:22:11

回答

2

你只聲明靜態變量num。您必須對其進行定義:

class Base 
{ 
private: 
    static int num; 
public: 
    friend void setvals(Base obj); 
}; 

// This must be in a .cpp 
int Base::num; 

void setvals(Base obj) 
{ 
    obj.num=4; 
} 

此代碼有效。

編輯:

其實你可以實現setvals()功能如下:

void setvals() 
{ 
    Base::num=4; 
} 

而在你的基類:

friend void setvals(); 

因爲num是靜態的。

0

靜態變量不屬於某個類的任何特定實例。相反,您可以使用類名稱作爲Base::num來提高可讀性,並且您的朋友函數定義的簽名與聲明的簽名不同。

+0

你*可以*作爲obj.num訪問它們。 – 2011-02-02 19:20:00

+0

您可以訪問,但這給程序員/讀者留下他們屬於該特定實例的印象。所以,爲了提高可讀性,您應該使用類名訪問它們。 – Mahesh 2011-02-02 19:22:33

+0

雖然它可能更具可讀性(我不認爲它總是這樣),但「必須使用類名訪問它們」仍然是錯誤的。 – 2011-02-02 19:26:36

4

你的自由函數被調用setvals,但Base的朋友函數被調用setnum ...

除此之外,您還必須真正定義靜態變量,而不是申報。

地說:

int Base::num; 
在源文件中

0

不同的朋友:

friend void setnum(Base obj); 
     // ^^^ Not the same as vals! 
     void setvals(Base obj) 
0

在C++中,在.h中聲明一個靜態變量是不夠的。你還必須在.cpp中明確地定義它。您必須在執行

int Base::num; 

你得到了,因爲這缺少變量定義的鏈接錯誤什麼的的.cpp增加。