为什么我调整大小的二维矢量会重置我的数据
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 版本)
我正在尝试将对象保存在 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 版本)