从外部访问静态成员并通过继承访问c ++

时间:2016-03-04 16:58:09

标签: c++ inheritance static include directx

我有一个班级,其中包含ID3D11Device成员,我想要static,因为现在,我希望多个{ID3D11Device可以访问Entity 1}}类实例。问题是,我无法访问Direct3D类,无法直接实例化ID3D11Device类,而是将Direct3D静态成员置于其对象之外。

由于多个类继承自Direct3D类(后者继承自WindowsClass详细信息的hwnd),我希望将其保留为基类,至于继续访问继承自Direct3D的所有类,如本例所示:

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

    static ID3D11Device* Device;
}

一个继承的类:

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

    void SomeDeviceDependentFunction();
}

成员定义为:

void EntityType::SomeDeviceDependentFunction(){
//Perform some action calling Direct3D::Device. 
}

请注意,Direct3D中定义了班级Direct3D.hEntityType中定义了EntityType.h,依此类推。因此,在编译并收到可怕的错误之前,所有内容都在概念上看起来很着色:

Error 52 error LNK2001: unresolved external symbol "public: static struct ID3D11Device * Direct3d::Device" (?Device@Direct3d@@2PAUID3D11Device@@A) C:\Us...tions.obj Win32Project1

Error 40 error LNK2005: "class std::vector<struct IndexVertexKey,class std::allocator<struct IndexVertexKey> > Geometry" (?Geometry@@3V?$vector@UIndexVertexKey@@V?$allocator@UIndexVertexKey@@@std@@@std@@A) already defined in D3DPipeline.obj C:\Use...nagement.obj Win32Project1

(请注意,此处的编译错误与上面给出的示例没有直接关系,但是由它们引起。)

总结一下,如何控制松散耦合的对象,(对象到对象)或者我可以引用的地方包括安全而不会死于交叉引用?

1 个答案:

答案 0 :(得分:1)

第一个错误是无定义错误。您需要在实现文件中定义静态成员变量(即Direct3D.cpp),

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

第二个错误是重复定义错误,您应该将全局变量的定义放在实现文件中,而不是头文件,这可能会多次包含并导致重复的定义错误。