Передача временных объектов по ссылке
У меня есть два класса: круг и точка
Класс Circle содержит Dot, а Dot содержит int. Circle имеет функцию getDot(), а Dot имеет функцию lessThan(Dot&).
Я хочу отсортировать массив Circles, elems[], по значениям int внутри Dot. Если у меня есть Circle Circle, который я хочу сравнить с каким-либо значением в массиве, мне нужна строка, которая выполняет следующие действия:
elems[0].getDot().lessThan(circ.getDot())
Но это не скомпилируется... Я могу решить проблему с помощью временного
Dot dt = circ.getDot()
и прохождение
elems[0].getDot().lessThan(dt)
но это кажется ненужным копированием. Есть ли более эффективный способ решить эту проблему?
К сожалению, я ограничен использованием lessThan (точка &) для сравнения, но я могу изменить его содержимое.
Ошибка компилятора: error: неверная инициализация неконстантной ссылки типа 'Dot &' из значения r типа 'Dot' cout<
1 ответ
Пример:
#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);
}