首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何存储LPD3DXSPRITE对象的向量?

如何存储LPD3DXSPRITE对象的向量?
EN

Stack Overflow用户
提问于 2009-11-26 21:13:35
回答 2查看 497关注 0票数 2

假设我想存储LPD3DXSPRITE对象的向量。声明此代码的行为std::vector<LPD3DXSPRITE> sprites;,我应该能够使用:

代码语言:javascript
复制
LPD3DXSPRITE sprite = NULL;
D3DXCreateSprite(myRenderingDevice, &sprite);

最后,我应该能够将它添加到向量中,如下所示:

代码语言:javascript
复制
sprites.push_back(sprite);

至少以我的理解,这应该是合理的。但是,这会编译但会产生运行时错误。为什么会这样呢?我做错了吗?我该怎么解决呢?

编辑:

这也可能是有帮助的。调用堆栈产生这个函数的结果,vector<ID3DXSprite *, std::allocator<ID3DXSprite *>>::push_back(ID3DXSprite * const &_Val=0x0036fd38就是这个函数的名称。这不是它所传递的向量。

但是,LPD3DXSPRITE仅仅是ID3DXSprite *的类型流。这能让我们看到什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-27 04:38:37

在查看了您的代码之后,我发现了这个问题。当您在应用程序中获得任何中断时,需要查看的是"Autos“选项卡或”局部变量“选项卡。在这里,您将注意到关于this指针的一些内容:它是空的!

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

我得做几件事才能让它起作用。我在Main.cpp中包括了Main.cpp,并添加了CreateInstance调用:

代码语言:javascript
复制
SpriteManager::CreateInstance();

唯一的问题是,与其他单例一样,您已经声明了构造函数/析构函数私有,但从未定义它们,所以我也这样做了:

代码语言:javascript
复制
SpriteManager::SpriteManager(){}
SpriteManager::~SpriteManager(){} 

在这些变化之后,它“起了作用”。这是用引号表示的,因为您的问题已经解决了,但是后面的代码m_GameManager->SetWagon(m_Wagon);中有另一个错误。

在这里,m_GameManager没有初始化。我取消了m_GameManager = GameManager::GetInstance();LudoEngine.cpp第43行的注释,这使我们陷入了和以前一样的问题,从来没有调用过CreateInstance。我在main中添加了必要的标头,称为create方法。这解决了问题,你的引擎运行(很酷的演示,也!)

ErrorLogger::LogError中,出口出现了一次崩溃,因为ErrorLogger为null。它是在LudoMemory的析构函数中被调用的,但是我会把这个留给你。

现在,我有两条小贴士可以帮你。第一个是关于我们正在解决的问题。通常情况下,如果单身人士还没有这样做,他们就会自己创造自己。我会把你的单身GetInstance改为这样的:

代码语言:javascript
复制
static T *GetInstance ( )
{
    if (!m_Singleton) // or == NULL or whatever you prefer
    {
        CreateInstance();
    }

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

这将强制创建单例,如果它还没有实现的话。现在,如果希望用户在尝试CreateInstance之前调用GetInstance,可以添加某种警告:

代码语言:javascript
复制
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;
}

因为这遗漏了“哪个单例?”的重要信息,所以您总是可以尝试在其中添加类型信息:

代码语言:javascript
复制
#include <typeinfo>

// ...

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

想在里面取一些类型的名字。

最后,可以使用delete 0,不需要选中的delete宏。

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

票数 3
EN

Stack Overflow用户

发布于 2009-11-27 00:00:18

密码在我看来没问题。但是,您正在向量中存储指向ID3DXSprite的指针。这是怎么分配的?是否可能已取消了sprite的分配,从而使向量最终持有无效的指针,然后尝试引用指针?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1805666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档