我有以下计划:
int main(){
std::queue<Stone> Q;
Stone s1=Stone(8,8);
s1.setStoneColor(Color::WHITE);
Q.push(s1);
Stone curr = Q.back();
Q.pop();
Stone s2=Stone(7,7);
s2.setStoneColor(Color::BLACK);
Q.push(s2); //here Q contains x=8,y=8,colour=WHITE...why??
Stone curr2 = Q.back();
Q.pop();
return 0 ;
}
为什么在最后的队列中白色石头有坐标(x,y)=(8,8)?
我认为对象是按值复制到Queue中的,因此没有任何引用/指针。
我还以为我没有指定析构函数?
使用智能指针可以通过某种方式解决这个问题吗?
我来自java背景所以这些奇怪的错误令人费解...... 感谢。
如果有帮助,我正在使用Clion IDE。
编辑:我在Xcode中尝试过同样的事情,在推出第二块石头后,预计会有7,7,黑色......
我相信这是Clion / Cmake / Debugger的事情,有人知道这些吗?
我正在使用的类是:
enum Color{
BLACK=0,
WHITE=1,
BLANK=2
};
和班级
class Stone {
int x = 0;
int y = 0;
bool discovered = false;
Color stoneColor;
public:
Stone(int _x, int _y) {
this->x = _x;
this->y = _y;
this->stoneColor = Color::BLANK;
}
void setDiscovered(bool value){
discovered=value;
}
bool getDiscovered(){
return discovered;
}
//setter
void setStoneColor(Color _stoneColor) {
stoneColor = _stoneColor;
}
//getter
Color getStoneColor()const {
return stoneColor;
}
int getPositionX() const {
return x;
}
int getPositionY() const{
return y;
}
bool operator==(const Stone &other) const {
if(this->x==other.getPositionX()&&this->x==other.getPositionY()&& this->stoneColor==other.getStoneColor()){
return true;
}
else{
return false;
}
}
};
答案 0 :(得分:-1)
当您执行第一个Q.pop()时,至少在下一次推送()之前,将期望Q为空。不知道它有白石的方式或原因。但是关于为什么你认为对象是按值复制的,或者你觉得它们是通过引用复制的,在这种情况下它们是按值复制的,如果没有用于Q.pop,你应该期望它们在那里cus它们被声明为main函数内的局部范围,它们应该至少在此范围内保持,除非被破坏。