#c #oop #operators
#c #ооп #операторы
Вопрос:
Я изучаю C из книги, и я нахожу ссылки и перегрузку операторов действительно сложными. Изучая перегрузку оператора, я не могу понять, почему эта программа не будет работать без конструктора, который принимает целое число в качестве параметра.
#include <iostream>
using namespace std;
class counter {
public:
counter();
counter(int value);
~counter();
int getValue() const { return itsValue; }
int setValue(int value) { itsValue = value; }
counter operator (const counteramp;);
private:
int itsValue;
};
counter::counter() :
itsValue(0)
{}
counter::counter(int value) :
itsValue(value)
{}
counter counter::operator (const counteramp; rhs) {
return itsValue rhs.getValue();
}
int main()
{
std::cout << "Hello World!n";
}
Я не могу понять, почему программа не будет работать при отсутствии этих строк:
counter(int value);
И
counter::counter(int value) :
itsValue(value)
{}
Комментарии:
1. Как вы думаете, почему программа не будет работать без этих строк? (Вы правы, что это не так, но в вопросе должно отображаться полное сообщение об ошибке)
2. Вам также не хватает определения конструктора
Ответ №1:
Если у вас нет этого конструктора:
counter(int value);
тогда вы не сможете делать такие вещи, как:
int n = 3;
counter c = counter{n};
counter c = counter{1};
counter c = 2;
// etc ...
Проблема с вашим operator
заключается в том, что вы делаете именно это, когда преобразуете int
значение itsValue rhs.getValue()
в a counter
, которое является возвращаемым типом:
counter counter::operator (const counteramp; rhs) {
return itsValue rhs.getValue();
}
Без соответствующего конструктора невозможно создать a counter
из an int
, и вы получите сообщение об ошибке.
Вы можете отказаться от предоставления int
конструктора, вручную создав counter
объект и вернув его:
counter counter::operator (const counteramp; rhs) const {
counter c;
c.itsValue = itsValue rhs.getValue();
return c;
}
Обратите внимание, что это operator
должно быть const
указано.
Вот демонстрация.
Несколько других исправлений: setValue
должен вернуться void
. Вы не определили деструктор, но предоставили объявление. Просто удалите объявление, поскольку достаточно неявно сгенерированного деструктора.
Комментарии:
1. «Для этого, конечно, требуется конструктор для счетчика, который принимает значение int» Я думаю, что то, что OP на самом деле не понимает, я бы уточнил это «конечно»
2. @Slava Хм, не уверен, сколько нужно редактировать, но я немного попробовал. Это лучше?
3. Я имею в виду, что OP, вероятно, не понимает / не знает, что один аргумент ctor работает для преобразования типов.
4. @Slava отредактировано. Теперь это должно быть более полезным.