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

Why does my resized 2D vector reset my data

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

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

Animation.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:
    ...
};

Animation.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
}

main.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 class 中的 2D 精灵矢量包含这些值。当第一个断点启动时,Point(1,1) 位于 sprites(0,0) 中,但是当我现在跳到下一个断点时,sprites(0,0) 中的值再次为 (0,0)。所以它重置了价值。我不知道为什么。

问题出在 Animation::getAnimationFrame() return 是其内部数据的副本:

AnimationFrame Animation::getAnimationFrame(int frame) const;

所以这修改了一个临时对象,并且在计算完整表达式后没有任何效果:

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

修复很简单:return 参考:

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

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

(是的,你需要一个 const 和一个非 const 版本)