在引用传递的向量上使用.size()成员函数

时间:2015-07-14 12:04:42

标签: c++ vector stl

我对使用vector的.size()成员函数感到困惑。

所以我所拥有的是一个按顺序显示一系列位图的对象,这些位图作为指针存储在向量中。然后通过引用传递该向量"&"在构建我的动画"对象,它完成了通过位图循环的所有工作。

除了在我引用的位图指针向量上调用.size()之外,一切都按照我的预期工作,虽然我知道向量有内容。

这会导致动画正常循环,然后它会因为尝试访问超出界限的元素而跳闸,因为.size()没有返回任何内容,搞乱我的边界检查。

我唯一的猜测是我的语法不正确,或者我没有正确理解其用法。

#include "animation.h"
#include "helperFunctions.h"
#include <vector>
#include <iostream>

animation::animation(int x, int y, SDL_Renderer* screenRenderer, std::vector<SDL_Texture*>& sprites) {
    _x = x;
    _y = y;
    _sprites = &sprites;
    _frames =  sprites.size() - 1;///this is to be used as an indexer, eg. 0 frames is 1 in reality, 3 is 4...
    _currentFrame = 0;///first frame index
    mainScreen = screenRenderer;
    _finished = false;
}

animation::animation(const animation& orig) {

}

animation::~animation() {
    std::cout << "animation object deleted!" << std::endl;
}

void animation::cycleFrame() {
    applyTexture(_x, _y, (*_sprites)[_currentFrame], mainScreen);
    std::cout << "_currentFrame: " << _currentFrame << std::endl;
    std::cout << "_frames      : " << _frames << std::endl;
    _currentFrame++;
    if (_currentFrame == _frames) {
        _finished = true;
    }
}

另外我应该补充一点,我不是要求任何SDL的帮助,只是整个vector.size()的事情。

提前感谢,非常感谢任何帮助。

更新:

所以我做了一些挖掘,似乎.size()在向量传递给构造函数之前也在向量上返回0 ... 在main()我有:

std::vector<SDL_Texture*> explosion16;        
explosion16.reserve(16);
for (int i = 0; i < 16; i++) {
    explosion16[i] = loadTexture(loadImage("gfx/explosions/explosion_16/e" + to_string(i) + ".bmp"));
}
cout << "explosion16.size() : " << explosion16.size() << endl;/////this returns as zero, 0

2 个答案:

答案 0 :(得分:4)

根据您的评论: 如果您使用reserve(),则不会增加大小,只增加容量。 您应该使用resize(),而不是使用索引器来初始化成员,或者保留reserve并使用push_back()代替[]

答案 1 :(得分:0)

在下面一行:

_frames =  sprites.size() - 1;

如果sprites.size()为零,则_frames可能为-1。