添加对象一次时,C ++ vector.push_back会添加两次对象

时间:2014-12-30 06:00:28

标签: c++ vector push-back

我正在创建一个DirectX程序,它需要能够动态地将对象添加到列表(或向量)中以使用render函数。我需要能够通过“[]”运算符访问这些对象,这是我使用向量而不是列表的原因。问题是当我使用push_back添加对象时,它会将该对象存储两次。例如;如果向量是空的并且我正在添加第一个对象,它会将该对象存储到索引0和索引1中。这会为我的渲染函数创建问题,渲染函数必须遍历每个对象并渲染它们。这导致每个对象被渲染两次。

定义位于头文件中的向量(SpriteList2)的代码:

class Level1 : public Dx11DemoBase// Define Level1 Class
{
public:
    vector<Sprite1> SpriteList2;//Define Vector
};

添加位于cpp文件中的对象的代码:

bool Level1::LoadContent()//funtion in the Level1 class
{
    Sprite1 Sprite_1({0.0f, 0.0f, 3.0f});//Define Sprite Object
    SpriteList2.push_back(Sprite_1);//Add Sprite Object to Vector

    Sprite1 Sprite_2({ 100.0f, 00.0f, 2.0f });//Define Sprite Object
    SpriteList2.push_back(Sprite_2);//Add Sprite Object to Vector

    Sprite1 Sprite_3({ 100.0f, -50.0f, 1.0f });//Define Sprite Object
    SpriteList2.push_back(Sprite_3);//Add Sprite Object to Vector
    return true;
}

循环遍历cpp文件中对象的代码:

void Level1::Render()//funtion in the Level1 class
{
    for (Sprite1 sprite : SpriteList2)//Loop through Vector
    {
        //Code to use the "sprite" object in rendering functions
        worldMat = sprite.GetWorldMatrix();//Retrieve values from each sprite object
    }
}

注释 添加对象的代码(如上所示)位于单独的cpp文件中,矢量在头文件中定义。

我尝试过使用相同结果的不同类型(例如:int)。如果向量是在头文件之外定义但向量必须在头文件中定义,以便呈现函数可以访问它,则不会发生此问题。

1 个答案:

答案 0 :(得分:1)

显示的代码中没有任何内容可以使对象插入两次,因此它归结为一些老式的调试技巧。首先,将加载器功能更改为:

bool Level1::LoadContent() {
    std::cout << "Enter LoadContent with size " << SpriteList2.size() << '\n';

    Sprite1 Sprite_1({0.0f, 0.0f, 3.0f});//Define Sprite Object
    SpriteList2.push_back(Sprite_1);//Add Sprite Object to Vector

    Sprite1 Sprite_2({ 100.0f, 00.0f, 2.0f });//Define Sprite Object
    SpriteList2.push_back(Sprite_2);//Add Sprite Object to Vector

    Sprite1 Sprite_3({ 100.0f, -50.0f, 1.0f });//Define Sprite Object
    SpriteList2.push_back(Sprite_3);//Add Sprite Object to Vector

    std::cout << "Exit  LoadContent with size " << SpriteList2.size() << '\n';

    return true;
}

(如果需要,使用与cout不同的调试方法)。这将有助于明确发生的事情是什么顺序。它非常你不太可能看到:

Enter LoadContent with size 0
Exit  LoadContent with size 6

您更有可能会看到一些其他组合会显示该代码外部的某些内容导致问题,例如多次调用该函数或影响该函数外部的向量。