假设我想存储 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/