【发布时间】:2014-07-13 08:23:45
【问题描述】:
编辑:
我浏览了一些教程,但很难理解 C++ 中接口的正确用法。
System::Initialize 负责初始化图形。 iGraphics 是我们初始化 DX9 或 DX11 的界面(基于最终用户规范) D3D 包含使用 DX 的功能。
我正在尝试通过纯虚拟函数调用 D3D,以便在运行时确定我们是使用 DX9、DX11 还是 - 可能 - OpenGL。
Interfaces.h:
#ifndef _INTERFACES_H_
#define _INTERFACES_H_
#pragma once
class iGraphics
{
public:
virtual ~iGraphics() {};
virtual bool vGetGraphics(HWND) = 0;
virtual void vShutdown() = 0;
virtual void vRender(float, float, float, float) = 0;
};
#endif
(部分)D3D.h
class D3D : public iGraphics
{
virtual void vShutdown() override;
virtual void vRender(float, float, float, float) override;
};
class D3D11 : Public D3D
{
public:
virtual bool vGetGraphics(HWND) override;
private:
bool CreatePipeline();
bool InitGraphics();
bool PrepareD3D(HWND);
};
问题: 我已经更正了大部分其他项目,现在我收到了错误:
error C2011: 'D3D11' : 'class' type redefinition
我所有的标题都以 ifndef 开头,还有什么可能导致这种情况?
【问题讨论】:
-
错误提示 non-static。这意味着它不是静态的。
-
@PawełStawarz 为疏忽道歉,我想我的问题是相反的。纯虚函数不能是静态的,那么对象有何不同?
-
你在尝试什么?
vGetD3D11()返回bool。您如何期望这会转换为iGraphics**?您可能不需要双指针。您尝试像静态方法一样调用该方法(使用class::method()语法)。您需要一个对象来调用该方法:auto dx11 = new D3D11(); dx11->vGetD3D11();。请注意,这可能会失败,因为您没有在D3D11中公开继承D3D。 -
@NicoSchertler 谢谢,对原始帖子进行了一些更改,但我仍然遇到问题。
-
现在它返回
void,它也不是指向iGraphics对象的指针。这个函数的目的是什么?dx11已经是iGraphics对象,可以转换为shared_ptr<iGraphics>。