C++ std::队列推送弹出两个不同的对象获取第一个对象

C++ std::queue push pop two different objects gets first object

本文关键字:两个 获取 一个对象 对象 队列 std C++      更新时间:2023-10-16

我有以下程序:

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( ?

我认为对象是按值复制到队列中的,因此没有任何引用/指针。

我还认为我不知何故没有指定析构函数?

是否可以通过使用智能指针以某种方式进行补救?

我来自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;
    }
   }
};

当你执行第一个 Q.pop(( 时,预计 Q 至少在下一个 push(( 之前为空。不知道它是如何或为什么有白色石头的。但是关于为什么你认为对象是按值复制的,或者你觉得它们是通过引用复制的,在这种情况下,它们是按值复制的,如果不是 Q.pop,你应该期望它们在那里,因为它们是在 main 函数内的本地范围内声明的,它们应该至少在这个范围内持续存在,除非被销毁。