为什么此派生对象无法访问基类的后递减方法?
Why can't this derived object access the base class' post-decrement method?
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--;
}
相关文章:
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 为什么此派生对象无法访问基类的后递减方法?
- 使用基类中的派生方法运行线程,而无需使用模板
- 将子类方法声明为基类的友元
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?
- 在派生类中使用基类的私有成员变量的最佳方法
- 如何在成为指向基类的指针后保留对子类方法的使用?
- 从基类实例调用派生类方法而不进行强制转换
- 继承:调用基类的成员和方法
- 通过基类接受方法转发派生 UniquePtr 的右值会移动引用而不是复制
- 引用基类模板的成员变量的简单方法
- C++ 使用派生类方法更改基类数据成员
- C++初始化之前派生类调用基类的方法
- 将派生类方法与基类unique_ptr一起使用
- 为什么派生类的实例从基类调用方法?
- 基类可以声明虚拟方法但不定义它吗?仍然在派生类中定义
- googletest:测试基类具有纯虚拟方法的派生类时的核心转储
- 从基类调用重写的方法
- 为什么允许将派生类的方法static_cast为基类的方法?
- C++-从方法基类调用派生类中的重写方法