2013-11-23 77 views
1

所以我有以下的C++類初始化靜態指針在靜態類

​​

然後在.cpp文件我做

void MyClass::InitObject 
{ 
    myObject = new MyObject(); 
} 

不過,我得到一個編譯器錯誤,指出「myObject的「是從InitObject()引用的,然後它說連接器命令失敗,退出代碼爲1.

爲什麼不能正常工作?我如何解決它?

+0

這是你真正編譯的代碼嗎? –

+0

我已經更改了類和靜態變量的名稱,但本質上是這是我編譯的 – user1855952

回答

1

您從未分配過空間MyObject::myObject。將這個在CPP文件:

MyObject* MyObject::myObject; 
+0

爲什麼我需要爲myobject分配空間?當我做myObject = new MyObject()時不會發生? – user1855952

+0

你的意思是MyObject * MyClass :: myObject? – user1855952

+0

不。爲對象分配空間,'myObject'是一個指針,而不是一個對象。您從未爲「MyObject :: myObject」分配空間,您在頭文件中指出的指針將存在。 (這是你的第一個問題,我不確定你的第二個問題是什麼意思,你問的是這個空間的風格問題?) –

1

擴展您的.cpp文件有以下definitionmyObject

MyObject* MyObject::myObject = NULL; 

注:
您的特定情況下,你可能會更好說:

class MyClass: 
{ 
public: 
    static MyClass& instance(); 

private: 
    MyClass() {} 
}; 

and in .cpp file:

MyClass& MyClass::instance() 
{ 
    static MyClass myInstance; 
    return myInstance; 
} 

我比較喜歡使用new MyClass()。任何訪問instance()方法將保證你的實例初始化一次,你會得到一個有效的引用。
'空間'在堆棧上完全分配,以及對於實例本身的引用。

5

由於C++需要的存儲空間是從實例存儲器分開的類的靜態數據成員,他們需要定義,除了在類是聲明

你這樣做,在一個單獨的翻譯單元(在你的CPP文件)是這樣的:

MyObject *MyClass::myObject; 

這個定義告訴編譯器在靜態存儲區分配空間myObject。沒有這個定義,代碼將會被編譯,但是鏈接器會報錯,因爲它負責確保所有被引用的靜態對象都有分配給它們的內存。