Перегрузка Operator[] возвращает неправильные данные

#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 .