我有一个班级,其中包含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.h
,EntityType
中定义了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
(请注意,此处的编译错误与上面给出的示例没有直接关系,但是由它们引起。)
总结一下,如何控制松散耦合的对象,(对象到对象)或者我可以引用的地方包括安全而不会死于交叉引用?
答案 0 :(得分:1)
第一个错误是无定义错误。您需要在实现文件中定义静态成员变量(即Direct3D.cpp
),
ID3D11Device* Direct3D::Device = nullptr; // or other initial value
第二个错误是重复定义错误,您应该将全局变量的定义放在实现文件中,而不是头文件,这可能会多次包含并导致重复的定义错误。