【问题标题】:Interface for Direct3D classDirect3D 类的接口
【发布时间】: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>

标签: c++ directx


【解决方案1】:

感谢@NicoSchertler,因为他指出了大部分需要纠正的错误。

这段代码我有很多问题,所以很难总结我必须修复的所有问题,但这是最终代码:

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();
    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;

}

System.cpp

bool System::Initialize()
{

    // Create Windows interface
    InitializeWindows();

    auto dx11 = new D3D11();
    bool rGetGraphics = dx11->vGetGraphics(hWnd);
    if (!rGetGraphics)
    {
        return false;
    }

return true;
}

仍然会感谢任何 cmets/建议或指向很棒的 DirectX 教程的链接。 谢谢。

【讨论】:

  • 还要注意 System::Initialize 正在泄漏内存。 dx11 是一个永远不会被释放的指针。我建议您阅读有关std::shared_ptrstd::unique_ptr 的信息。虽然我怀疑dx11 可能已在您的实际代码中传递或定义。
  • 附带说明,您没有正确使用 cmets。例如:/* Create the pipeline */ bool rPipe = CreatePipeline(); 函数名称已经说明了它的作用,因此无需重复该信息。
猜你喜欢
  • 2012-11-10
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
相关资源
最近更新 更多