c++ - 如何存储 LPD3DXSPRITE 对象的 vector ?

标签 c++ vector directx

假设我想存储 LPD3DXSPRITE 对象的 vector 。声明此代码的行将是 std::vector<LPD3DXSPRITE> sprites;我应该能够创建我的 Sprite :

LPD3DXSPRITE sprite = NULL;
D3DXCreateSprite(myRenderingDevice, &sprite);

最后,我应该能够将其添加到 vector 中,如下所示:

sprites.push_back(sprite);

至少根据我的理解,这应该是合理的。但是,这可以编译但会出现运行时错误。为什么是这样?我这样做有错吗?我该如何解决它?

编辑:

这也可能有帮助。该函数的调用堆栈产生 vector<ID3DXSprite *, std::allocator<ID3DXSprite *>>::push_back(ID3DXSprite * const &_Val=0x0036fd38就是所谓的。这不是它传递的 vector 。
然而,LPD3DXSPRITE 只是 ID3DXSprite * 的类型定义。这能揭露什么吗?

最佳答案

查看你的代码后,我发现了问题所在。当您的应用程序出现任何中断时,需要查看“自动”选项卡或“本地”选项卡。在这里,您会注意到 this 指针的一些信息:它是 null!

这意味着调用 AddSprite 的实例不存在。这是你的 SpriteManager,我看到它是一个单例。在您的 main 中,您不会创建它的实例。

我必须做一些事情才能让它工作。我在 Main.cpp 中包含了 "LudoRenderer/SpriteManager.h",并添加了 CreateInstance 调用:

SpriteManager::CreateInstance();

唯一的问题是你已经将构造函数/析构函数声明为私有(private),就像其他单例一样,但从未定义它们,所以我也这样做了:

SpriteManager::SpriteManager(){}
SpriteManager::~SpriteManager(){} 

经过这些更改,它“起作用了”。之所以用引号括起来,是因为您的问题已解决,但稍后代码中出现另一个错误 m_GameManager->SetWagon(m_Wagon);

此处,m_GameManager 未初始化。我在LudoEngine.cpp第43行取消了m_GameManager = GameManager::GetInstance();的注释,这让我们遇到了和之前一样的问题,没有CreateInstance 曾经被调用过。我在 main 中添加了必要的 header ,称为 create 方法。这解决了问题,并且您的引擎运行了(也很酷的演示!)

退出时发生崩溃,在 ErrorLogger::LogError 中,因为 ErrorLogger 为 null。它在 LudoMemory 的析构函数中被调用,但我将把这个留给你。 :)

现在,我认为有两个技巧会有所帮助。第一个是关于我们正在解决的问题。通常,如果单例尚未创建的话,他们会自行创建。我会将您的单例 GetInstance 更改为如下所示:

static T *GetInstance ( )
{
    if (!m_Singleton) // or == NULL or whatever you prefer
    {
        CreateInstance();
    }

    return m_Singleton; // not sure what the cast was for
}

这将强制创建单例(如果尚未创建)。现在,如果您希望用户在尝试 GetInstance 之前调用 CreateInstance,您可以添加某种警告:

static T *GetInstance ( )
{
    if (!m_Singleton) // or == NULL or whatever you prefer
    {
        CreateInstance();
        std::cerr << "Warning, late creation of singleton!" << std::endl;

        // or perhaps:
        ErrorLogger::GetInstance()->
                        LogError(L"Warning, late creation of singleton!");
    }

    return m_Singleton;
}

由于遗漏了重要信息“哪个单例?”,您始终可以尝试向其中添加类型信息:

#include <typeinfo>

// ...

std::cerr << "Warning, late creation of singleton: "
          << typeid(T).name() << std::endl;

尝试在其中获取一些类型名称。

最后,删除 0 是可以的,不需要您选中的删除宏。

为了澄清,您有LUDO_SAFE_DELETE,它在调用删除之前检查它是否不为空。在 C++ 中,删除 null 没有任何效果,因此不需要进行检查。您的安全删除的所有实例都可以仅用您的 LUDO_DELETE 替换。

关于c++ - 如何存储 LPD3DXSPRITE 对象的 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1805666/

相关文章:

C++ 扩充 STL 数据结构

c++ - CUB 的 TexRefInputIterator 是如何工作的?

c++ - 使用集合对 vector 进行排序

C++ vector 或 Queue 在内存和速度方面构建大 Q

directx - 有没有办法将元数据附加到 HLSL 全局(统一/常量)变量?

c# - 在 C# WPF 或 Windows 窗体应用程序中使用 DirectX c++ DLL

winapi - 禁用 GPU 加速

c++ - 为什么 vkCreateSwapchainKHR 会在 0 处导致访问冲突?

c++ - 错误 LNK2019 : unresolved external symbol

scala - Scala 中什么时候应该选择 Vector?