2016-03-04 107 views
0

我有一個類,其中包含ID3D11Device成員,我想製作static,因爲現在我想讓ID3D11Device被多個Entity類實例訪問。問題是,我無法訪問Direct3D類,將靜態成員放置在對象的外部,而無需直接實例化Direct3D類。通過外部訪問靜態成員並通過繼承C++

由於多個類從Direct3D類(而這又從WindowsClass繼承了hwnd細節)繼承,我想保持它作爲一個基類,以保持與所有類別的Direct3D繼承的這個例子訪問提出:

class Direct3D: WindowsClass{ 
public: 
    Direct3D(); 
    ~Direct3D(); 

    static ID3D11Device* Device; 
} 

和繼承的類:

class EntityType: Direct3D{ 
public: 
    EntityType(); 
    ~EntityType(); 

    void SomeDeviceDependentFunction(); 
} 

當構件被定義爲:

該類 Direct3DDirect3D.h定義
void EntityType::SomeDeviceDependentFunction(){ 
//Perform some action calling Direct3D::Device. 
} 

注意,EntityTypeEntityType.h定義,等等。所以一切看起來肉汁的概念,直到我去編譯並收到可怕的錯誤:

Error 52 error LNK2001: unresolved external symbol "public: static struct ID3D11Device * Direct3d::Device" ([email protected]@@[email protected]@A) C:\Us...tions.obj Win32Project1

和:

Error 40 error LNK2005: "class std::vector<struct IndexVertexKey,class std::allocator<struct IndexVertexKey> > Geometry" ([email protected]@[email protected]@@[email protected]@@@[email protected]@@[email protected]@A) already defined in D3DPipeline.obj C:\Use...nagement.obj Win32Project1

(請注意,這裏的編譯錯誤不直接涉及到上面給出的例子,但是由它們造成的。)

總而言之,如何控制繼承類,它們是鬆散耦合的(object to object)還是我可以在哪裏參考包括安全而不會死亡的交叉引用?

+1

必須在類定義之外定義'static'成員變量。 'ID3D11Device * Direct3D :: Device = <適當的初始值>;' –

+0

謝謝,我正在嘗試這個。 –

回答

1

第一個錯誤是一個沒有定義的錯誤。你需要在實現文件(即Direct3D.cpp)來定義靜態成員變量,

ID3D11Device* Direct3D::Device = nullptr; // or other initial value 

的第二個錯誤是重複的定義錯誤,你應該把全局變量定義在執行文件,而不是頭文件,這可能會被多次包含並導致重複的定義錯誤。

+0

謝謝,我現在就試試。 –

+0

啊!這工作!一些非常直截了當的東西!我從字面上讀了三種形式的C++文檔,但並不理解它。我可以將此標記爲答案。 –

+0

我想用這個評論來表達額外的感激之情:UGH,男人!它正在按照計劃行事!這樣的解脫! –