为什么调整大小的 2D 矢量会重置我的数据

Why does my resized 2D vector reset my data

本文关键字:我的 数据 调整 2D 为什么      更新时间:2023-10-16

我正在尝试将对象保存在 2D 矢量中。需要在运行时调整矢量的大小。因此,我使用许多其他问题中提到的调整大小功能。

她是我问题的分解代码示例。所以代码可能没有意义,但我得到同样的错误。

动画.h

class myPoint{
public:
    int x, y;
    myPoint(){}
    myPoint(int x, int y) : x(x), y(y) {}
};
class AnimationFrame {
private:
    std::vector<std::vector<myPoint>> sprites; //the important part
public:
    void addSpritePoint(myPoint gridPos, myPoint tilePos);
    ...
};
class Animation {
private:
    std::vector<AnimationFrame*> animationFrames;
public:
    ...
};

动画.cpp

Animation::Animation() {}
int Animation::addAnimationFrame() {
    AnimationFrame *newAnimationFrame = new AnimationFrame();
    this->animationFrames.emplace_back(newAnimationFrame);
}
//AnimationFrame class
AnimationFrame::AnimationFrame(){
    int w = 3; //just for the test
    int h = 3;
    this->sprites.resize(w, std::vector<myPoint>(h, myPoint(0,0)));
}
void AnimationFrame::addSpritePoint(myPoint gridPos, myPoint tilePos) {
    this->sprites[gridPos.x][gridPos.y] = tilePos;
    //printf(""); //breakpoint here
}

主.cpp

int main() {
    Animation *a = new Animation();
    a->addAnimationFrame();
    a->getAnimationFrame(0).addSpritePoint(myPoint(0,0), myPoint(1,1));
    a->getAnimationFrame(0).addSpritePoint(myPoint(0,1), myPoint(2,2));
    a->getAnimationFrame(0).addSpritePoint(myPoint(0,2), myPoint(3,3));
}

我希望我的 AnimationFrame 类中的精灵 2D 矢量包含这些值。当第一个断点在 Point(1,1) 中启动时,Point(1,1) 在精灵 (0,0) 中,但当我现在跳到下一个断点时,精灵 (0,0) 中的值再次为 (0,0)。因此,它会重置值。我不知道为什么。

问题来自Animation::getAnimationFrame()返回其内部数据的副本:

AnimationFrame Animation::getAnimationFrame(int frame) const;

因此,这会修改一个临时对象,并且在计算完整表达式后不起作用:

a->getAnimationFrame(0).addSpritePoint(myPoint(0,0), myPoint(1,1));

修复很简单:通过引用返回:

const AnimationFrame& Animation::getAnimationFrame(int frame) const
{
    return *animationFrames[frame];
}
AnimationFrame& Animation::getAnimationFrame(int frame)
{
    return *animationFrames[frame];
}

(是的,您需要一个常量和非常量版本)