C++ 对通过引用传递的向量使用.size()成员函数

C++ 对通过引用传递的向量使用.size()成员函数,c++,vector,stl,C++,Vector,Stl,我对vector的.size()成员函数的用法感到有些困惑 所以我有一个对象,它按顺序显示一系列位图,这些位图作为指针存储在向量中。然后,在构建我的“动画”对象时,该向量通过引用“&”传递,该对象在位图中循环执行所有工作 除了在位图指针的引用向量上调用.size()之外,一切都按照我的预期进行,它不会返回任何内容,尽管我知道该向量包含内容 然后,这会导致动画正常循环,然后它会跳起来,因为它试图访问超出边界的元素,因为.size()没有返回任何内容,从而打乱了边界检查 我唯一的猜测是我的语法不正确

我对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;
    }
}
#包括“animation.h”
#包括“helperFunctions.h”
#包括
#包括
动画::动画(intx、inty、SDL_渲染器*屏幕渲染器、std::向量和精灵){
_x=x;
_y=y;
_精灵=&精灵;
_frames=sprites.size()-1;///这将用作索引器,例如,0帧实际上是1,3是4。。。
_currentFrame=0;///第一帧索引
主屏幕=屏幕渲染器;
_完成=错误;
}
动画::动画(常量动画和原始动画){
}
动画::~animation(){
标准::cout在下一行:

_frames =  sprites.size() - 1;
_如果sprites.size()为零,帧可能为-1。

在下一行:

_frames =  sprites.size() - 1;
_如果sprites.size()为零,帧可能为-1。

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

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

“…它不返回任何东西…”我想您的意思是“.它返回零…”我认为问题不在给出的代码中。请记住,
sprites.size()
是在创建
动画
对象时计算的。它不是
精灵
的“活动”大小。如果需要“活动”大小,然后捕获指向
精灵
向量的指针或引用,并将其用于大小计算您发布的代码看起来很好。也许您也可以发布该部分,在其中检查绑定/超出绑定发生的位置感谢回复人员,边界检查由CycleName()中的if语句完成方法,检查经过的帧是否等于总帧数,如果是,则finished设置为true。外部有一个函数,可根据finished Flag控制动画对象的删除和创建。此外,如果我只是手动将帧硬编码为16,则一切正常。“…它不返回任何东西…”我猜你的意思是“.它返回零…”我认为问题不在给出的代码中。请记住,
sprites.size()
是在创建
动画
对象时计算的。它不是
sprites
的“活动”大小。如果需要“活动”大小“大小,然后捕获一个指向
精灵
向量的指针或引用,并将其用于大小计算您发布的代码看起来不错。也许您也可以发布该部分,在其中检查绑定/超出绑定发生的位置感谢回复,边界检查由CycleName()中的if语句完成。”方法,检查经过的帧是否等于总帧数,如果是,则finished设置为true。外部有一个函数,根据finished Flag控制动画对象的删除和创建。此外,如果我只是手动将帧硬编码为16,则一切正常。yesssss,得到它,谢谢你。我从中学到的是,向量的大小值比肉眼看到的要多得多。我会记住这一点。再次感谢Guysyssss,明白了,谢谢。所以我从中学到的是,向量的大小值比肉眼看到的要多得多。我会记住这一点汉克斯:对这个做什么/你为什么需要做的解释会使这个答案更好。对这个做什么/你为什么需要做的解释会使这个答案更好。
 if(sprites.size() > 0)
 _frames =  sprites.size() - 1;