![](/img/trans.png)
[英]defining a private member function outside class definition and use of static data
[英]Defining private static class member
class B { /* ... */ };
class A {
public:
A() { obj = NULL; }
private:
static B* obj;
};
然而,這會產生大量的鏈接器錯誤,符號obj未解析。
沒有這些鏈接器錯誤的私有靜態類成員的“正確”方法是什么?
你需要這樣定義:
這是在標題中:
class B { ... }
class A {
public:
A() { obj = NULL; }
private:
static B* obj;
}
這是源頭
B* A::obj = NULL;
你需要添加
B *A::obj = NULL;
你的一個cpp文件。 另請注意,如果在A的構造函數中設置obj,則意味着無論何時創建A對象,都會再次重置obj - 因為它是靜態的,所以只有一個obj在所有A實例之間共享。
您必須在cpp文件中初始化obj:
B* A::obj = NULL;
您不能在構造函數中初始化它,因為它是一個靜態變量。
http://www.parashift.com/c++-faq/ctors.html#faq-10.12
(正如@peoro所說,請記住用一個;
)結束每個類的定義。
鏈接錯誤是因為你還需要在類定義之外聲明靜態變量,純粹是為了鏈接目的和靜態內存分配
B* A::obj;
您聲明了靜態成員,但沒有定義它。
此外,無論何時構造A的任何實例,您都要設置其值,而實際上您只需要初始化一次。
class B;
class A {
private:
static B* obj;
};
B* A::obj = NULL;
由於您的類A定義可能位於頭文件中,因此您應該確保obj(我添加的)的定義只在一個(和一個).cpp文件中。 這是因為它必須在編譯的項目中只出現一次,但是頭文件的內容可能多次被#included
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.