Многие темы о stackoverflow затронули эту тему, но я не могу понять это правильно для моего примера. У меня есть класс Event с временем, когда происходит событие. Я хочу отсортировать эти объекты в векторе по тому времени.
Сначала я начал реализовывать оператор <, но затем компилятор выдал следующую ошибку:
Ошибка 1 ошибка C2582: функция 'operator =' недоступна в 'Событии' c: \ program files (x86) \ microsoft visual studio 12.0 \ vc \ include \ algorithm 3009 1 sorting
Итак, я добавил оператор =
Ниже приведен код, который я использовал:
#include <algorithm> // std::sort
#include <vector> // std::vector
using namespace std;
class Event{
public:
const double time;
Event(double);
bool operator<(const Event&);
bool operator=(const Event&);
};
Event::Event(double time) :
time(time){
}
bool Event::operator<(const Event& rhs)
{
return this->time < rhs.time;
}
bool Event::operator=(const Event& rhs)
{
return this->time == rhs.time;
}
int main() {
vector<Event> vector;
Event e1 = Event(10);
Event e2 = Event(5);
Event e3 = Event(7);
vector.push_back(e1);
vector.push_back(e2);
vector.push_back(e3);
sort(vector.begin(), vector.end());
return 0;
}
Когда я отлаживаю, я замечаю, что мои объекты вообще не отсортированы. Они находятся в том порядке, в котором я их добавил. Ниже приведен отрывок из переменной 'vector':
[0] {time=10.000000000000000 } Event
[1] {time=5.0000000000000000 } Event
[2] {time=7.0000000000000000 } Event
У меня следующие вопросы:
- Почему мои события не сортируются в векторе, когда я вызываю сортировку?
- Зачем сортировке нужен оператор =?
3 ответа
Проблема в том, что объекты вашего класса Event
не могут быть назначены из-за члена const double time
. Поскольку членом является const
, его нельзя изменить, поэтому вы не можете использовать sort
в контейнере с объектами Event
, потому что для сортировки требуется присваивание.
Либо удалите const
, либо переосмыслите то, что вы пытаетесь сделать. Кстати, вы сбиваете с толку оператор присваивания (operator=
, это то, что sort
требует ) with equality operator (
operator == `).
Чтобы изменить порядок объектов внутри вектора, объект должен быть копируемым (или перемещаемым). Вы должны определить оператор = (который является присваиванием), имеющий форму:
Event& operator=(const Event& other)
{
if(&other != this) { this->time = other.time; }
return *this;
}
Итак, ваша реализация оператора = неверна. Вы сравниваете два объекта, но это не то, что должен делать оператор = (присваивание!). Он должен назначить один объект (его содержимое) другому объекту и вернуть ссылку на назначенный объект. Имейте в виду, что вы также должны предоставить конструктор копирования, если вы реализуете оператор присваивания.
Это правильная реализация оператора настраиваемого присваивания для вопроса:
Event& Event::operator=(const Event& other)
{
if(&other != this) {
// As time is const, we modify it through a secondary reference
// you can say it cheating with the compiler
double &rTime = (double&) this->time;
rTime = other.time; // this modifies this->time variable
}
return *this;
}
Также измените объявление оператора присваивания:
class Event{
public:
Event& operator=(const Event&);
// other declarations...
};
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
operator=
— оператор присваивания. Возможно, вы хотелиoperator==
.