#cpp #visual_cpp
#includeusing 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; Реализация оператора сложения самостоятельной функцией была бы свободна от этого недостатка.
Комментариев нет:
Отправить комментарий