#c #operator-overloading
#c #перегрузка оператора
Вопрос:
Я следил за руководством по перегрузке операторов из TutorialsPoint.
Это мой класс:
struct Decimal {
private:
int16_t exponent;
uint8_t length;
uint16_t mantissa[DecimalMaxSize]{};
...
public:
uint16_t amp;operator[](int i);
...
и моя реализация:
uint16_t amp;Decimal::operator[](int i) {
if( i > DecimalMaxSize ) {
std::cout << "Index out of bounds" << std::endl;
// return first element.
return mantissa[0];
}
return mantissa[i];
}
Когда я теперь хочу использовать это так:
Decimal *d = new Decimal(...);
uint16_t di = d[i];
Я получаю следующую ошибку: «Нет жизнеспособного преобразования из ‘Decimal’ в’uint16_t'»
Как я могу это исправить?
Комментарии:
1. Почему
new
? Не используйте его. ПопробуйтеDecimal d (...);
2. C — это не Java или C #. Здесь вам не нужен
new
указатель and .3. @Amadeus Не пытайтесь исправить проблему, которой нет…
4. @molbdnilo Не пытайтесь исправить проблему, которой нет…
5. @ChristianSeiler если проблем нет, почему вы задаете вопрос? Удалите
new
оператор, и код будет выполняться с проблемами. Тогда у вас будет хороший повод подумать, что вы делаете неправильно
Ответ №1:
d[i];
будет операцией для индексации массива Decimal
объектов, потому d
что это указатель. Чтобы вызвать overloaded operator []
для объекта itlsef, вы должны сначала разыменовать этот указатель и написать (*d)[i]
или d->operator [](i);
Комментарии:
1. или
d[0][i]
который будет обращаться к объекту, на который указано, затем вызовет[]
оператор.2. @doug Некоторые сочли бы такое использование неправильным, поскольку указатель
d
не указывает на массив объектов.3. Разве это не то же самое, что массив с одним элементом? Для меня
(*d)
иd
[0]`выглядят одинаково, но я согласен, что первое обозначение чаще рассматривается как относящееся к изолированному объекту, поэтому, возможно, передает больше контекста. Однако это довольно редко можно увидеть. Обычно такие объекты создаются на месте, а не в куче.4. @doug Да, это было бы то же самое, но некоторые методы и инструменты кодирования требуют, чтобы вы отслеживали размер массива при индексации такого указателя, и запись массива размером 1 из воздуха не будет соответствовать.
5. Согласен. это законно, но не является хорошей практикой, как и большая часть кода C .