在向量C ++中存储类

时间:2013-05-08 16:50:29

标签: c++ visual-studio-2010 visual-c++ directx stdvector

我正在使用C ++ / DirectX创建游戏,我遇到了存储精灵的问题。目前我可以创建一个精灵然后将它存储在一个向量中,这样做可以完美地实现一个精灵。但是,当我去插入另一个精灵时,前一个精灵的纹理属性会被删除。我将包括一些断点和一些代码的屏幕截图。

我怀疑的问题是对象没有放入向量中,而是依赖于用于创建精灵的临时对象。以下是一些截图:

https://www.dropbox.com/s/g5xdlaqf35w6q57/1.png

https://www.dropbox.com/s/xmcyv611nqc27xc/2.png

还有一些代码:

// d2World.h
class d2World
{
public:
    // Some functions
    vector<d2Sprite> spritesList;
    // More stuff

private:
    d2Sprite *tempSprite;
    // Other private variables
};

// d2World.h
// Some other functions

// A new object is created by re-assigning it
tempSprite = new d2Sprite();

// When a the sprite is completed, add it to the vector
spritesList.push_back(*tempSprite);

// More stuff here

我不明白为什么只有纹理属性受到影响?

感谢您的帮助。

修改 以下是d2Sprite类的标题代码:

class d2Sprite
{
public:
    d2Sprite(void);
    ~d2Sprite(void);
    void Load(LPDIRECT3DTEXTURE9 tex);
    void Position(int x, int y);

    int x, y, frame, frameW, frameH, columns;
    float Rotation;

    D3DXVECTOR3 GetPosition();

    D3DXVECTOR2 Scale;
    D3DXVECTOR2 Center;
    D3DXVECTOR2 Translation;

    LPDIRECT3DTEXTURE9 texture;

    D3DCOLOR colour;
};

3 个答案:

答案 0 :(得分:2)

您正在创建d2Sprite的副本,而LPDIRECT3DTEXTURE9似乎是一个指针......

spritesList.push_back(*tempSprite);

为什么要用new创建d2Sprite,然后将它们复制到向量中,你可能应该有一个

vector<d2Sprite*> spritesList;

并将指针复制到向量

spritesList.push_back(tempSprite);

当你不再需要它时,在矢量中的项目上调用delete。

答案 1 :(得分:0)

如果没有看到d2Sprite的完整定义,我只能猜测纹理属性受影响的原因是d2Sprite要么没有正确的复制构造函数,要么没有复制构造函数,编译器提供的默认复制构造函数不能正确复制纹理属性。

将对象插入STL容器时,实际上会插入对象的副本,而不是对象本身。如果您不想要副本,请考虑使容器保持指向对象的指针(这样只复制指针本身,而不是对象)。

答案 2 :(得分:0)

这只是猜测,因为没有足够的代码可以肯定地知道。以下是我的想法:

d2Sprite没有复制构造函数,向量包含d2Sprite对象,而不是指针。当临时对象tempSprite被添加到向量时,它被复制,因此原始指针LPDIRECT3DTEXTURE9被逐位复制。

我在这里猜测你正在删除或覆盖临时对象tempSprite。当临时被删除或覆盖时,向量中的d2Sprite现在有一个指向释放内存的LPDIRECT3DTEXTURE9。这将导致纹理丢失。请注意,它可能会一直正常显示,直到内存被覆盖,通常是在下一次内存分配完成时。创建下一个d2Sprite时,将分配内存,此时可能会覆盖您已经释放的DIRECT3DTEXTURE9对象。

一般来说,如果使用RAII,可以避免这样的问题,特别是像boost :: shared_ptr或(在C ++ 11中)std :: shared_ptr这样的智能指针。如果使用得当,RAII会处理这些分配的内存生存期问题。如果没有RAII,必须跟踪所有已分配资源的生命周期。