c ++迭代向量返回甚至不在其中的对象

时间:2013-12-06 04:11:07

标签: c++ vector iterator

我正在组装一个弹球桌,在这里我有一个PinballTable类。我想在矢量中保存所有游戏对象(弹球,缓冲器,鳍状物等),我称之为_gameObjs。

当我遍历向量时,它返回构造函数中声明的最后一个GameObj,无论GameObj是否在向量中。如果我向向量添加多个GameObjs,它将多次返回最后一次声明的GameObj。我正在从C#过渡,收藏似乎是我最好的,虽然我完全被这里难过了

在这里,我添加了三个对象:两个保险杠和一个弹球。在更新函数中,我试图让它输出每个对象的x大小输出,所以我知道它正在迭代。在这里,例如,我甚至没有将弹球添加到矢量,但它每次更新调用时输出两次弹球的x大小。

#include "PinballTable.h"

GameObj* _pinball;
int TABLE_WIDTH;
int TABLE_HEIGHT;

float _tableTiltedAngle     = 6.5f;
float _radiansPerDegree     = PI / 180;
float _gravityForce         = cos( _tableTiltedAngle * _radiansPerDegree ) * GRAVITY;

vector<GameObj> _gameObjs;


PinballTable::PinballTable( const int width, const int height )
{
    TABLE_WIDTH     = width;
    TABLE_HEIGHT    = height;


    GameObj bumper1(
        GameObj::shapeCircle,
        GameObj::typeStatic,
        color4f( 1.0f, 1.0f, 0.0f, 1.0f),
        point2f( 300.0f, 600.0f ),
        vec2f( 40.0f, 0.0f )
        );
    _gameObjs.push_back( bumper1 );


    GameObj bumper2(
        GameObj::shapeCircle,
        GameObj::typeStatic,
        color4f( 1.0f, 1.0f, 0.0f, 1.0f),
        point2f( 50.0f, 200.0f ),
        vec2f( 50.0f, 0.0f )
        );
    _gameObjs.push_back( bumper2 );


    GameObj pinball( 
        GameObj::shapeCircle,
        GameObj::typeDynamic, 
        color4f( 1.0f, 1.0f, 0.0f, 1.0f), 
        point2f( 100.0f, 100.0f), 
        vec2f( 20.0f, 20.0f) 
        );


    _pinball = &pinball;
}


PinballTable::~PinballTable(void)
{
}





// ------------------------------ Update Functions ------------------------------
void PinballTable::update( GameTime& gameTimer )
{
    for( vector<GameObj>::iterator i = _gameObjs.begin(); i != _gameObjs.end(); ++i )
    {
        cout << i->getSize()->x << endl;
    }
}

感谢您的帮助

获取size函数只返回GameObj中的vector2(x,y组件)。每次输出大小与PinballTable构造函数中最后声明的GameObj大小相匹配

vec2f* GameObj::getSize( void )
{
    return &_size;
}

解决:

正如一些人所指出的,其中一个问题是GameObjs是在构造函数中创建的。

在GameObj类中,我没有在头文件中声明不同的成员。将这些成员切换到头文件似乎解决了这个问题,原因我不知道。

5 个答案:

答案 0 :(得分:1)

你的GameObj是接口还是抽象类?如果是这样,你不应该把它直接放在一个向量中,而是一个指向它的指针。将一个向量看作一个包含所放入的序列化副本的字节数组(因为你来自C#,这应该有帮助)。 C ++没有统一的对象表示,因此记住对象需要的空间是至关重要的。

答案 1 :(得分:1)

你在构造函数中创建了3个GameObj,它们将在构造函数返回后被破坏,当你将它们添加到向量时,它们就是垃圾。

答案 2 :(得分:0)

这是你想要的吗,

for( vector<GameObj>::iterator i = _gameObjs.begin(); i != _gameObjs.end(); ++i )
{
    cout << (*i).getSize()->x << endl;
}

您需要通过dereference(*)运算符获取存储在向量中的对象。

答案 3 :(得分:0)

如果可能的话,我会使用基于范围的for循环:

for (auto const &g : _gameObjs)
    cout << g.getSize()->x << "\n";

这是在C ++ 11中添加的,因此您可能必须给编译器一个开关来告诉它识别/允许C ++ 11结构(例如,您通常必须使用g ++)。

答案 4 :(得分:0)

您描述问题的方式,听起来好像_size是全局变量,而不是GameObj的成员