проблема с перегрузкой оператора конструктора

#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 отредактировано. Теперь это должно быть более полезным.