Перегрузка функции вызова оператора и присваивания - PullRequest
1 голос
/ 03 августа 2011

В моем проекте я пишу оболочку для std::vector.Я делаю это, потому что я использую однородные координаты, и для некоторых операций просто легче временно «забыть» четвертую координату.

Теперь я наткнулся на проблему.У меня есть множество заданий, таких как:

    Vector v;
    v(0) = 5;
    v(1) = 6;

и так далее.Я также хочу сделать следующее:

   double x;
   x = v(0);

Для этого я могу перегрузить оператор (), но как реализовать первое?(ноль и единица являются индексом).

Ответы [ 4 ]

5 голосов
/ 03 августа 2011

Просто верните ссылку.

class Vector
{
  int data[4];
  int & operator() (int index) { return data[index]; }
};
1 голос
/ 03 августа 2011

В стандартных библиотеках такие вещи реализуются с помощью operator() (ну, обычно operator[]) возвращаемого типа double &. Возвращая ссылку на двойник, вы можете присвоить ей или получить ее.

Однако, вы уверены, что хотите обернуть это вокруг std::vector? Этот класс не является вектором в математическом смысле; это очень похоже на Java ArrayList, и поэтому совсем не эффективно для небольших структур. Обычно, когда я пишу свои собственные векторные классы, я планирую иметь их много, поэтому я реализую класс с нуля поверх статического массива.

1 голос
/ 03 августа 2011

Две вещи-

  1. Возможно, вам придется перегружать operator[], чтобы сделать это, а не operator(), поскольку здесь это более естественный оператор.operator() используется для создания функциональных объектов, в то время как operator[] является оператором, означающим «выбрать элемент в этой позиции».

  2. Вы можете поддерживать присвоение результата operator[] / operator(), когда функция возвращает ссылку на значение, в которое следует записать.В качестве простого примера, вот некоторый код, который представляет класс, обертывающий необработанный массив:

(код здесь:)

class Array {
public:
    int& operator[] (unsigned index);
    int  operator[] (unsigned index) const;

private:
    int array[137];
};

int& Array::operator[] (unsigned index) {
    return array[index];
}
int Array::operator[] (unsigned index) const {
    return array[index];
}

Вторая из этих функций - этоconst перегрузка, поэтому вы можете const Array читать, но не записывать значения.

1 голос
/ 03 августа 2011

Возвращает неконстантную ссылку на элемент, который нужно изменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...