0

自分のバグ/問題がどこにあるのかわからないので困惑しています。2つのカスタム演算子、1つの割り当てと1つの比較演算子を使用するクラスInstructionがあります。以前は、std :: sortを使用して、メンバーの1つであるstd :: string nameに基づいて命令をソートするために、比較演算子のみを使用していました。ただし、プロジェクト全体のリファクタリングを開始したため、一部のメンバーを定数に変更しました。これにより、これらの定数に初期化リストを使用する必要がありました。これにより、代入演算子を作成する必要があります。これらの命令は、ベクトルにプッシュバックされるときにコピーされるためです。これはすべてがうまくいかないところです。クラス宣言とコンストラクターと演算子を含めます。

Instruction.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
}

Instruction.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;
}

代入演算子を作成した唯一の理由(正直なところ、これまでに作成したことはありません)は、命令をプッシュバックしようとしたときに、コンパイラが「ここから」命令をインスタンス化できないと文句を言ったためです。定数メンバーで行います。メンバーが一定でなくても、並べ替えもすべて正常に機能しました。今、奇妙な部分。std :: sortを削除すると、上記のコードは機能しますが、常に機能するわけではありません。しばらくするとクラッシュすることもあれば、クラッシュしないこともあります。しかし、並べ替えを含めると、すぐにクラッシュします。誰か助けてもらえますか?

4

1 に答える 1

2

三つのルールを忘れないでください。コピー構成、コピー代入演算子、およびデストラクタのいずれかを使用している場合は、それらすべてを使用する必要があります。

ただし、コピー代入演算子は事実上無限ループです。それはそれ自身を呼びます。Operator =は、次の形式のいずれかがある場合に使用されますInstruction &=Instruction&。まさにそれ(*this) = Iです。

私の質問はこれです:なぜそれらのものは一定なのですか?メンバーが事実上一定であるということは、コピー割り当てでオブジェクトをコピーできないことを意味します(const-castを使用しない限り)。それらをコピーして構築することはできますが、それだけです。

それらのメンバーが一定である理由はありますか?もしそうなら、あなたはこれらのオブジェクトを割り当てによってコピーするべきではありません。この2つは相互に排他的です。

メンバーが効果的に一定であり、外部のアクティビティによって変更できない必要がある場合(ただし、コピーを妨げるlanguage -constは必要ありません)、これは適切なアクセサメソッドを使用して実行する必要があります。クラスのユーザーにこれらの値を取得する方法を提供しますが、設定する方法は提供しません。

于 2011-07-02T23:13:31.627 に答える