簡體   English   中英

定義私有靜態類成員

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM