2016-03-04 130 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,男人!它正在按照计划行事!这样的解脱! –