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

时间:2018-10-29 19:00:17

标签: c++ class

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

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--;
}