Direct3D类的接口

Interface for Direct3D class

本文关键字:接口 Direct3D      更新时间:2023-10-16

编辑

我看了一些教程,但我很难理解C++中接口的正确使用。

System::Initialize负责初始化图形。iGraphics是我们初始化DX9或DX11的接口(基于最终用户规格(D3D包含使用DX的功能。

我试图通过纯虚拟函数调用D3D,这样就可以在运行时决定我们是使用DX9、DX11还是OpenGL。

接口.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开头,还有什么原因导致了这种情况?

感谢@NicoSchertler指出了大多数需要更正的错误。

我在这个代码上有很多问题,所以很难总结我必须修复的所有问题,但这是最后一个代码:

接口.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();
    virtual void vRender(float, float, float, float);
};
class D3D11 : public D3D
{
public:
    virtual bool vGetGraphics(HWND);
private:
    bool CreatePipeline();
    bool InitGraphics();
    bool PrepareD3D(HWND);
};

D3D.cpp

// Initializes Direct3D
bool D3D11::vGetGraphics(HWND hWnd) 
{
    // Initialize Direct3D
    bool rPrep = PrepareD3D(hWnd);
    if (!rPrep)
    {
        return false;
    }
    // Create the pipeline
    bool rPipe = CreatePipeline();
    if (!rPipe)
    {
        return false;
    }
    // Initialize graphics
    bool rInitG = InitGraphics();
    if (!rInitG)
    {
        return false;
    }
    return true;
}

系统.cpp

bool System::Initialize()
{
    // Create Windows interface
    InitializeWindows();
    auto dx11 = new D3D11();
    bool rGetGraphics = dx11->vGetGraphics(hWnd);
    if (!rGetGraphics)
    {
        return false;
    }
return true;
}

如果有任何意见/建议或链接到一个伟大的DirectX教程,我们将不胜感激。谢谢