所以我有以下的C++類初始化靜態指針在靜態類
然後在.cpp文件我做
void MyClass::InitObject
{
myObject = new MyObject();
}
不過,我得到一個編譯器錯誤,指出「myObject的「是從InitObject()引用的,然後它說連接器命令失敗,退出代碼爲1.
爲什麼不能正常工作?我如何解決它?
所以我有以下的C++類初始化靜態指針在靜態類
然後在.cpp文件我做
void MyClass::InitObject
{
myObject = new MyObject();
}
不過,我得到一個編譯器錯誤,指出「myObject的「是從InitObject()引用的,然後它說連接器命令失敗,退出代碼爲1.
爲什麼不能正常工作?我如何解決它?
您從未分配過空間MyObject::myObject
。將這個在CPP文件:
MyObject* MyObject::myObject;
爲什麼我需要爲myobject分配空間?當我做myObject = new MyObject()時不會發生? – user1855952
你的意思是MyObject * MyClass :: myObject? – user1855952
不。爲對象分配空間,'myObject'是一個指針,而不是一個對象。您從未爲「MyObject :: myObject」分配空間,您在頭文件中指出的指針將存在。 (這是你的第一個問題,我不確定你的第二個問題是什麼意思,你問的是這個空間的風格問題?) –
擴展您的.cpp文件有以下definition爲myObject
:
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()
方法將保證你的實例初始化一次,你會得到一個有效的引用。
'空間'在堆棧上完全分配,以及對於實例本身的引用。
由於C++需要的存儲空間是從實例存儲器分開的類的靜態數據成員,他們需要定義,除了在類是聲明。
你這樣做,在一個單獨的翻譯單元(在你的CPP文件)是這樣的:
MyObject *MyClass::myObject;
這個定義告訴編譯器在靜態存儲區分配空間myObject
。沒有這個定義,代碼將會被編譯,但是鏈接器會報錯,因爲它負責確保所有被引用的靜態對象都有分配給它們的內存。
這是你真正編譯的代碼嗎? –
我已經更改了類和靜態變量的名稱,但本質上是這是我編譯的 – user1855952