Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

visual studio и перегрузка операторов

#cpp #visual_cpp


#include 

using namespace std;

class pop {
    int x;

 public:
    int getX() {
        return x;
    }
    pop() : x{ 0 } {}

    pop operator + (pop& p) {
        return pop(this->x + p.x);
        // здесь ошибка E0289: отсутствуют экземпляры конструктора pop::pop,
        // соответствуюшие списку аргументов; и всегда у меня ошибки с
        // перегрузкой в vs
    }
};

    


Ответы

Ответ 1



Вам нужен конструктор для класса pop, который принимает один параметр типа int. Вы в вашем return пытаетесь использовать именно его, но создать его вы забыли. Этот конструктор может быть отдельным конструктором, но можно, если вам понравится, воспользовавшись аргументами по умолчанию, написать один общий конструктор: и для конструкции из int, и для конструкции по умолчанию pop(int x = 0) : x{ x } {} Также, если вы не объявите такой конструктор explicit, то он будет конструктором преобразования и в реализации вашего оператора вы сможете, при желании, просто написать return x + p.x; Но это дело вкуса. Бинарный оператор сложения лучше реализовывать самостоятельной (возможно дружественной) функцией, а не методом класса, как у вас. Однако даже при реализации методом класса не стоит забывать о константной корректности pop operator + (const pop& p) const и, конечно int getX() const Если вы предоставите конструктор конверсии из типа int, вы сразу же сможете также выполнять сложения вида pop a, b; a = b + 5; // Автоматически рассматривается компилятором как `b + pop(5)` Однако из-за того, что оператор сложения у вас реализован методом класса, вы не сможете выполнять сложения вида a = 5 + b; Реализация оператора сложения самостоятельной функцией была бы свободна от этого недостатка.

Комментариев нет:

Отправить комментарий