【问题标题】:C++ vectors, sorting and custom class operatorsC++ 向量、排序和自定义类运算符
【发布时间】:2011-09-27 10:53:51
【问题描述】:

我很困惑,因为我不知道我的错误/问题在哪里。 我有一个类指令,它使用两个自定义运算符,一个赋值和一个比较运算符。 以前我只使用比较运算符,以便使用 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 指令时,编译器抱怨无法实例化“从这里”指令,我想它与固定成员有关。没有成员是不变的,一切都很好,即使是排序。 现在奇怪的部分。如果我删除 std::sort,上面的代码可以工作,但不是一直有效。有时它会在一段时间后崩溃,有时它不会崩溃。但是在我包括排序的那一刻,它会立即崩溃。 有人可以帮忙吗?

【问题讨论】:

    标签: c++ class operators assignment-operator comparison-operators


    【解决方案1】:

    不要忘记三原则:如果你有复制构造、复制赋值运算符和析构函数之一,那么你应该拥有所有

    但是,您的复制赋值运算符实际上是一个无限循环;它自称。只要您有以下形式,就会使用 Operator=:Instruction &amp;=Instruction&amp;。这正是(*this) = I 的含义。

    我的问题是:为什么这些事情是不变的?有效地让成员保持不变意味着您不能通过复制分配复制对象(除非您使用 const-cast)。您可以复制构建它们,但仅此而已。

    这些成员保持不变有什么原因吗?如果是这样,那么您不应该通过分配复制这些对象。两者互斥。

    如果您需要一个成员有效地保持不变,不受外部活动的影响(但不是 language-const 防止复制),那么这应该使用适当的访问器方法来完成。为类的用户提供获取这些值的方法,而不是设置它们的方法。

    【讨论】:

    • 这些成员可以从其他类访问,我想确保它们的值不会改变。但是,我确实希望它们的值是可复制的。哪里是无限循环,我一头雾水
    • @Alex:那么那些其他类应该使用访问器来获取这些值,而不是直接获取它们。唯一应该直接接触类的成员变量的类是类本身
    • 所以,我不应该让它们成为常量,对其他类使用 getter,并删除赋值运算符?
    • Nicol 是绝对正确的,(*this) = I; 调用赋值运算符(本身)产生无限递归。不能用const 成员变量编写赋值运算符,也不能没有赋值运算符sort。要么在你的向量中保留指针(所以只分配指针而不是对象),或者使成员变量私有和非常量,并提供受保护的内联访问器函数,这些函数通过 const 引用返回它们。
    • 好的,现在我知道问题出在哪里了。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-05-05
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    相关资源
    最近更新 更多