Передача временных объектов по ссылке - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть два класса: Circle и Dot

Class Circle содержит Dot, а Dot содержит int.В Circle есть функция getDot (), а в Dot - функция lessThan (Dot &).

Я хочу отсортировать массив кругов, elems [], по значениям int внутри Dot.Если у меня есть Circle Circle, который я хочу сравнить с каким-либо значением в массиве, мне по существу нужна строка, которая выполняет следующее:

elems[0].getDot().lessThan(circ.getDot())

Но это не скомпилируется ... Я могу исправитьпроблема с временным

Dot dt = circ.getDot()

и передачей

elems[0].getDot().lessThan(dt)

, но это кажется ненужным копированием.Есть ли более эффективный способ решить эту проблему?

К сожалению, я ограничен использованием lessThan (точка &) для сравнения, но я могу изменить его содержимое.

Ошибка компилятора:ошибка: неверная инициализация неконстантной ссылки типа 'Dot &' из значения типа 'Dot' cout

1 Ответ

0 голосов
/ 27 сентября 2018

пример:

#include <vector>
#include <algorithm>

struct Dot
{
    Dot(int i) : value_(i) {}
    bool lessThan(Dot const& other) const
    {
        return value_ < other.value_;
    }

    int value_;
};

struct Circle
{
    Circle(Dot dot = Dot(0))
    : dot_(dot)
    {
    }

    const Dot& getDot() const { return dot_; }

    Dot dot_;
};


void sortCircles(std::vector<Circle>& circles)
{
    auto order = [](Circle const& l, Circle const& r)
    {
        return l.getDot().lessThan(r.getDot());
    };
    std::sort(circles.begin(), circles.end(), order);
}
...