C++ 运算符=重载,递归调用终止符

C++ 运算符=重载,递归调用终止符,c++,operator-overloading,overloading,C++,Operator Overloading,Overloading,我在重载赋值运算符时遇到问题。控制台中出现“递归调用终止符”错误 我对数据结构比较陌生,调试这个问题时遇到困难 下面是类声明: class Player { public: Player(const unsigned int x_, const unsigned int y_, const char i_); Player(const Player& p_); ~Player(); unsigned int getX() const; unsig

我在重载赋值运算符时遇到问题。控制台中出现“递归调用终止符”错误

我对数据结构比较陌生,调试这个问题时遇到困难

下面是类声明:

class Player
{
public:
    Player(const unsigned int x_, const unsigned int y_, const char i_);
    Player(const Player& p_);
    ~Player();

    unsigned int getX() const;
    unsigned int getY() const;
    char getI() const;

    void updatePosition(int newX, int newY);

    Player& operator=(const Player& p_);
private:
    struct Position{
        unsigned int x;
        unsigned int y;
    };

    Position* pos;

    char i;
};
下面是运算符=函数的实现:

Player& Player::operator=(const Player& p_)
{
    delete pos;
    pos = nullptr;

    pos = new Position();
    pos->x = p_.getX();
    pos->y = p_.getY();

    i = p_.getI();

    return *this;
}

我认为使用
Position*pos
不是一个好选择。 您必须始终通过构造函数初始化它

尽管您这样做了,但在
Player&operator=(constplayer&p)
中, 我认为一线和二线有问题。 您已经通过
delete pos
删除了内存中的
pos

但是您试图将
pos
设置为
nullptr

不相关:没有充分的理由将
pos
设置为指针。这只会使事情复杂化,并迫使需要复制和赋值操作符。没有指针,就没有问题。或者至少不是你目前正在与之战斗的玩家。你能添加实际的错误消息吗?最好的猜测——你正在尝试为自己分配一个玩家:
Player p<代码>p=p或类似的东西。您如何确定
位置
指向有效的
位置
?警告: