Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;vector.push_back在添加对象一次时添加两次对象_C++_Vector_Push Back - Fatal编程技术网

C++ C++;vector.push_back在添加对象一次时添加两次对象

C++ C++;vector.push_back在添加对象一次时添加两次对象,c++,vector,push-back,C++,Vector,Push Back,我正在创建一个DirectX程序,它需要能够动态地将对象添加到列表(或向量)中,以便使用渲染功能。我需要能够通过“[]”操作符访问这些对象,这就是我使用向量而不是列表的原因。问题是,当我使用push_back添加对象时,它会存储该对象两次。例如如果向量为空,并且我正在添加第一个对象,它将把该对象存储到索引0和索引1中。这给我的渲染函数带来了问题,它必须循环遍历每个对象并渲染它们。这将导致每个对象渲染两次 定义位于头文件中的向量(SpriteList2)的代码: class Level1 : pu

我正在创建一个DirectX程序,它需要能够动态地将对象添加到列表(或向量)中,以便使用渲染功能。我需要能够通过“[]”操作符访问这些对象,这就是我使用向量而不是列表的原因。问题是,当我使用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;
}
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),结果是一样的。如果向量是在头文件外部定义的,则不会出现此问题,但必须在头文件内部定义向量,以便渲染函数可以访问它。

显示的代码中没有任何东西会使对象插入两次,因此归结为一些老式的调试技巧。首先,将loader函数更改为类似以下内容:

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;
}

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

无法使用此代码重现。请创建一个可以完成这个问题的最小和完整的例子,“问题是当我用PurthJeBead添加一个对象时,它会存储两次”——你是第一个在C++标准库中找到这个bug的人吗?与此形成对比的是,您自己的代码中可能存在一个bug:-)正如其他人所说,您的代码中有一个bug,您没有向我们展示。vector类肯定不会在每次插入时存储每个项目两次,您必须调用
push\u back()
的频率是您认为的两倍。或者你的程序中的某个地方出现了彻底的内存损坏;初始化函数可能在主循环开始之前多次调用它。谢谢
Enter LoadContent with size 0
Exit  LoadContent with size 6