2011-04-25 45 views
0

這裏是我的頭代碼:如何初始化靜態類的疙瘩成語的d(指針)?

#ifndef CLANDTYPES_H 
#define CLANDTYPES_H 

class CLandTypes 
{ 
public: 
    CLandTypes(); 
    ~CLandTypes(); 
private: 
    class Pimple; 
    static Pimple * d; 
}; 

#endif // CLANDTYPES_H

,因爲它應該是一個靜態類,我tryed代碼在我的cpp文件:

#include "clandtypes.h" 

CLandTypes::Pimple * CLandTypes::d = new CLandTypes::Pimple(); 
... 

但什麼是錯的!

---------- ----------編輯

這裏是我的擴展C++代碼:

#include "clandtypes.h" 

#include "qvector.h" 
#include "qpair.h" 

CLandTypes::Pimple * CLandTypes::d = new CLandTypes::Pimple(); 

class CLandTypes::Pimple 
{ 
public: 
    Pimple(); 
    ~Pimple(); 

    QVector > LandTypes; 
}; 

CLandTypes::Pimple::Pimple() 
    : LandTypes(NULL) 
{ 
    LandTypes.push_back(qMakePair((unsigned int) 0, (QString)"undefined")); 
    LandTypes.push_back(qMakePair((unsigned int) 1, (QString)"rocky")); 
} 

CLandTypes::Pimple::~Pimple(){} 

CLandTypes::CLandTypes() 
{ 
    if (!d) 
    { 
     d = new Pimple(); 
     if (!d) 
     { 
      throw std::bad_alloc(); 
     } 
    } 
} 

CLandTypes::~CLandTypes() 
{ 
    if(d) 
    { 
     delete d; 
     d = NULL; 
    } 
} 

我的兩個錯誤是:

無效使用不完全類型的「結構CLandTypes ::疙瘩」
的「結構CLandTypes ::疙瘩」

+1

你會得到什麼信息? – 2011-04-25 09:26:19

+2

那會是什麼?你收到什麼錯誤信息? – 2011-04-25 09:26:24

+1

您是否在某處定義了Pimple類?當你做'新'時可見嗎? – 2011-04-25 09:29:55

回答

1

移動這一行:

CLandTypes::Pimple * CLandTypes::d = new CLandTypes::Pimple(); 

是類定義CLandTypes::Pimple後。

它反對您嘗試使用new來創建一個它一無所知的類的實例。

如果這樣做,請刪除在您的CLandTypes::CLandTypes構造函數的定義中檢查d是否爲nullptr(也稱爲!d)的代碼。此代碼可能導致內存泄漏。另外,在調用new後再檢查::std::bad_alloc是完全沒有必要的,因爲new被定義爲在分配失敗時拋出::std::bad_alloc

內存泄漏的發生方式是,如果構造函數在運行初始化CLandTypes::d的靜態初始化程序之前運行。只有在其他位置的靜態初始化器中使用CLandTypes的構造函數時纔會發生這種情況。會發生什麼是構造函數將爲d賦值,然後d的靜態初始化程序將稍後運行並覆蓋該值,從而導致內存泄漏。

+0

好的我讓構造函數emty和移動線 - 謝謝 – oRUMOo 2011-04-25 16:48:55

+0

@oRUMOo:這是否解決了您的問題? – Omnifarious 2011-04-25 18:16:43

+0

是的 - 我該做些什麼嗎? (我不太瞭解這個平臺) – oRUMOo 2011-04-25 18:56:24

0

嘗試宣告「類疙瘩」向前聲明爲public而非PRIVA如果有幫助,請嘗試讓我知道。 確保在實例化它之前定義該類。

+0

公開課疙瘩不是一個好主意,因爲它破壞了疙瘩成語。 – oRUMOo 2011-04-25 10:40:49

+0

@oRUMOo:理論上它的確如此,實際上你的用戶仍然需要在你的頭文件中看到這個名字,所以它也可能是公開的。 – quamrana 2011-04-25 11:21:23

+0

@ oRUMOo:如果您想在班級以外訪問班級成員,他們必須公開。如果您希望這些成員是私有的,請使用accessor類型方法通過公共包裝函數公開它。如果你想對這個Pimple有一個靜態的引用,可以嘗試使用一個靜態的容器類對象。 – aeon 2011-04-25 14:21:20