В C ++ возможно ли вернуть элемент класса из функции-члена класса? - PullRequest
0 голосов
/ 16 февраля 2020

В C ++ возможно ли вернуть элемент класса из функции-члена класса?

namespace translation2d
{
    class translation2d
    {
        public:
           double x;
          double y;

        public:
            translation2d()
            {
                x=0;
                y=0;
            }

        public:
            translation2d translateBy(translation2d other); 
            //being interpreted as a constructor?
    }

    translation2d translation2d::translateBy(translation2d other)
    {//I need this member function to return an object of type translation2d
        x+=other.x;
        y+=other.y;
    }
};

Ответы [ 2 ]

5 голосов
/ 16 февраля 2020

Конечно, с чем-то вроде

struct Translation2d {
    double x, y;
    Translation2d(double x, double y) : x(x), y(y) {}
    Translation2d translate_by(const Translation2d& other) {
        return Translation2d(x + other.x, y + other.y);
    }
};
0 голосов
/ 16 февраля 2020

6502 ответ правильный, а код аккуратный.

Я просто хотел дать исправление, минимизирующее изменения вашего исходного кода, для ясности:

translation2d translation2d::translateBy(translation2d other)
{
    translation2d copy = *this;

    copy.x += other.x;
    copy.y += other.y;

    return copy;
}

Идея состоит в том, to:

  1. Создайте копию «текущего» объекта, чтобы вы не влияли на оригинал (вам это не нужно)
  2. Возвращайте эту копию после настройки это с данными из other

Если вы пишете по-другому, мы можем избежать копирования аргумента снова , поскольку вы уже передали его по значению:

translation2d translation2d::translateBy(translation2d copy)
{
    copy.x += this->x;
    copy.y += this->y;

    return copy;
}

… Хотя я ожидаю, что компилятор сделает это за вас в реальности, и мне труднее читать эту версию кода. В последнем разделе этого ответа вы найдете другие способы избежать лишней копии (при условии, что вы склонны беспокоиться об этом).


Альтернативная версия этой функции фактически переведет значение объект, а не возвращение нового:

translation2d& translation2d::translateBy(translation2d other)
{
    this->x += other.x;
    this->y += other.y;

    return *this;
}

Обратите внимание, что я все еще что-то возвращаю, а не void; в этом случае я следовал соглашению о возврате ссылки на текущий объект, что помогает объединить несколько модификаций в один и тот же объект. Вы часто найдете этот шаблон в перегрузке операторов.

Технически this-> не требуется, но это немного облегчает понимание функции.


Обратите внимание, что 6502 изменилось функция для получения other по const-reference, что часто является хорошей идеей, и вам следует подумать об этом тоже (хотя копирование двух double s настолько дешево, что может не стоить косвенного обращения).

...