C ++ векторы, сортировка и операторы пользовательских классов - PullRequest
0 голосов
/ 03 июля 2011

Я озадачен, потому что я не могу понять, где моя ошибка / проблема.У меня есть класс Instruction, который использует два пользовательских оператора, один оператор присваивания и один оператор сравнения.Ранее я использовал оператор сравнения только для того, чтобы использовать std :: sort для сортировки инструкций на основе одного из их членов - имени std :: string.Однако, поскольку я начал перефакторинг всего проекта, я изменил некоторых участников на постоянные.Это привело меня к необходимости использовать список инициализации для этих констант.Это, в свою очередь, привело меня к необходимости создания оператора присваивания, потому что эти инструкции копируются при возврате в векторы.Здесь все идет не так.Я включил объявление класса и конструктор и операторы.

инструкция.hpp

class Instruction 
{
  private:  
    unsigned int param_size;
    const float max_angle, min_angle;
    bool micro_mutated;
  protected:
    const std::string body_part;
    std::vector<Parameter <float> > parameters;
  public:
    Instruction(std::string name, float max, float min);
    Instruction operator=(const Instruction& I);
    bool operator<(const Instruction& I) const;
    //there are a few more functions but are completely irrelevant
}

инструкция.cpp:

Instruction::Instruction(std::string name,float max, float min) :
body_part (name), max_angle(max), min_angle(min)
{}

Instruction Instruction::operator=(const Instruction& I)
{
  (*this) = I;
  return (*this);
}

bool Instruction::operator<(const Instruction& I) const
{
  return body_part < I.body_part;
}

Единственная причина, по которой я создал оператор присваивания(что, честно говоря, я никогда не делал раньше), потому что, когда я пытался push_back Instructions, компилятор жаловался на невозможность создания инструкций "отсюда", и я думал, что это связано с постоянными членами.Без постоянных членов все работало нормально, даже сортировка.Теперь странная часть.Если я удаляю std :: sort, приведенный выше код работает, но не все время.Несколько раз он падал через некоторое время, иногда он не падал.Но в тот момент, когда я включаю сортировку, она сразу падает.Может кто-нибудь помочь, пожалуйста?

1 Ответ

2 голосов
/ 03 июля 2011

Не забывайте правило троек: если у вас есть одна из конструкции копирования, оператора назначения копирования и деструктора, то у вас должно быть всех из них.

Однако,ваш оператор присваивания копии - фактически бесконечный циклэто называет себя.Оператор = будет использоваться всякий раз, когда у вас есть что-либо в форме: Instruction &=Instruction&.Что именно является (*this) = I.

Мой вопрос таков: почему эти вещи постоянны?Наличие постоянных членов означает, что вы не сможете скопировать объект (если вы не используете const-cast) с назначением копирования.Вы можете скопировать их конструкцию, но это все.

Есть ли какая-то причина для того, чтобы эти члены были постоянными?И если так, то вы не должны копировать эти объекты по назначению.Они являются взаимоисключающими.

Если вам нужен член, который должен быть фактически постоянным, неизменным в результате внешней деятельности (но не language -const, который предотвращает копирование), то это должно быть сделано с правильнымметоды доступа.Предоставьте пользователям класса способы получения этих значений, но не способы их установки.

...