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
答案 0 :(得分:1)
您正在尝试使用减后运算符,但是您已经声明了减前运算符!
要使此代码正常工作,请使用减量comp--;
=> --comp;
。或切换到定义后减运算符Player& operator--();
=> Player& operator--(int);
。在此处查看有效的示例:ideone。
有关每个减/增运算符的外观的详细信息,请参见the cppreference page。
答案 1 :(得分:1)
后减量运算符应如下所示:
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;
}
它应该返回对象的副本,就像它在减小其值之前的样子。
set.seed(1)
dat = data.frame(start = seq.Date(today() - 5, today(), 'day'), end = seq.Date(today(), today() + 5, 'day'))
dat1 = dat %>% rowwise() %>% mutate(range = list(seq.Date(start, end, 'day')))
dat1$date = sample(seq(as.Date('1998/10/01'), as.Date('1998/12/01'), by="day"), 6)
答案 2 :(得分:-1)
问题出在您只定义预递增运算符的事实。
请参阅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--;
}