为什么此派生对象无法访问基类的后递减方法?

Why can't this derived object access the base class' post-decrement method?

本文关键字:方法 基类 访问 派生 对象 为什么      更新时间:2023-10-16
class Player
{
private:
int score;
public:
Player(int number);
~Player();
int get_score() { return score; }
Player& operator--();
};
Player::Player(int number)
{
score = number;
}

Player::~Player()
{
}

//-----
//Please turn your attention to this function
//-----
Player& Player::operator--() {
score--;
return *this;
}

大家好,在上面的课上,我重载了后递减运算符来减少"分数"。从这个类派生出两个子类——计算机和人类。根据我的理解,他们也应该有权使用这个功能。然而,当我尝试时:

Computer comp_; Human player_;
comp--;
human--;

我收到一个错误:"这两个类都没有定义这个运算符,也没有定义到预定义运算符可访问的类型的转换"。我不允许在子类中重新定义此函数。

如果有人能帮我弄清楚如何让这些代码正常工作,那真的会很有帮助<3

您试图使用后减量运算符,但您已经声明了前减量运算符!

要使此代码正常工作,请使用预减量comp--;=>--comp;。或者切换到定义递减后运算符Player& operator--();=>Player& operator--(int);。请参阅此处的工作示例:ideone。

有关每个递减/递增运算符的详细信息,请参阅cpprreference页面。

递减后运算符应该如下所示:

T T::operator--(int);    // Inside class definition
T operator++(T& a, int); // Outside class definition

它应该返回对象的副本,就像你降低它的值之前一样。

class Player
{
private:
int score;
public:
Player(int number);
virtual ~Player();
int get_score() { return score; }
template<typename T>
friend T& operator--(T& p) { // pre
--p.score;
return p;
}
};
Player::Player(int number) : score(number) {}
Player::~Player() {}
template<typename T>
T operator--(T& p, int) {        // post
T save(p);
--p;                         // using pre
return save;
}

问题来自于您只定义预增量运算符的事实。

参见https://en.cppreference.com/w/cpp/language/operator_incdec

增量前返回一个引用,但是增量后返回一个值,因此如果需要保留返回的对象类型。我将后增量定义为模板,并使用前增量的实现。

namespace Game
{
class Player
{
private:
int score;
public:
Player(int number);
~Player();
int get_score() { return score; }
Player& operator--();
};
Player::Player(int number)
{
score = number;
}
Player::~Player()
{
}
Player& Player::operator--() {
score--;
return *this;
}
template <class T> T operator--(const T& a, int)
{
T save(a);
save--;
return save;
}
class Human : public Player
{
public:
Human(int player) :Player(player) {}
};
class Computer : public Player
{
public:
Computer(int player) :Player(player) {}
};
}

示例

int main()
{
Game::Human h(2);
Game::Human h2 = h--;
}