【问题标题】:Implement assignment operator for class with large amount of elements为具有大量元素的类实现赋值运算符
【发布时间】:2017-12-19 09:34:16
【问题描述】:

我的课看起来像

class A{
    double a, b, c, d, e;
    float af, bf, cf, df, ef;
    std::vector<double> av, bv, cv, dv, ev;
    std::vector<std::vector<double>> avv, bvv, cvv, dvv, evv;

    A(){}
    A(/*init values*/){/*Initialize all the values above using the input values*/}
    ~A(){}
}

现在我想实现一个赋值运算符,这样我可以(在第二类中):

class B{
    private:
        A ac, bc, dc;
    public:
        B(/*init values*/)
        {
            ac = A(/*init values*/);
            bc = A(/*init values*/);
            dc = A(/*init values*/);
        }
        ~B(){}
}

我知道我可以关注What is the copy-and-swap idiom?和What are the basic rules and idioms for operator overloading?并实施

A& A::operator=(A rhs)
{
  swap(rhs);
  return *this;
}

以及各自的swap-function:

friend void swap(A& first, A& second)
{
    using std::swap;

    swap(/*for each element*/);
}

对所有元素都这样做很容易忘记一个元素,从而导致代码错误。未来的扩展也是如此,即在类头中添加变量,但不在交换函数中。有没有更简单的方法来做到这一点?

【问题讨论】:

  • 你知道赋值运算符不用自己写,但是编译器生成的就可以了?
  • 所有元素都是具有正确值语义的类型。你儿子不需要自己实现任何这些功能。编译器非常有能力。
  • 你也可以移除析构函数。最好说A() = default; 而不是A() {}。
  • 如果你添加一个需要它的成员,你也需要实现所有这些成员函数。 Read about the rule of 5.
  • @arc_lupus 是的,它会使你的代码明显变慢,因为它使你的类不可移动。

标签: c++ operator-overloading


【解决方案1】:

您可以将所有数据成员放在一个聚合中,只是不要声明任何构造函数、赋值运算符和析构函数。您将获得默认移动/复制构造函数/赋值和聚合初始化的好处(如果初始化很简单,这可能会对您有所帮助):

struct A{
    double a, b, c, d, e;
    float af, bf, cf, df, ef;
    std::vector<double> av, bv, cv, dv, ev;
    std::vector<std::vector<double>> avv, bvv, cvv, dvv, evv;
    };
void swap(A& a,A& b){
    a=std::exchange(b,a);
    }

如果您必须维护一些不变量,在内部结构中声明数据可能会有所帮助:

class A{
  struct data_t{
    double a, b, c, d, e;
    float af, bf, cf, df, ef;
    std::vector<double> av, bv, cv, dv, ev;
    std::vector<std::vector<double>> avv, bvv, cvv, dvv, evv;
    };
  data_t data;
  //[...]
  void swap(A& other){
     data = std::exchange(other.data,data);
     }
  };

【讨论】:

  • 此版本与上述 cmets 中建议的版本有何不同(只是好奇)?
  • @arc_lupus 这比我想象的要糟糕。你应该考虑买一本关于 C++ 的学术书籍,你属于从这种讲座中获得最大收益的人。
  • 我的问题看起来很糟糕吗? o_O
  • @arc_lupus,是的。此外,您的问题和我阅读的 cmets 表明您确实缺乏很多关于 c++ 类的基本概念。回答你对你和我来说都是浪费时间。您应该以了解“类”项下的所有内容为目标:en.cppreference.com/w/cpp/language。你现在应该开始接受我们都是永远的学徒。拒绝它,活在你所知道的错误信念中,会让你成为一个永远的无知者。如果你已经知道了,你能学到什么?
  • 哦,好吧,到目前为止,我认为我至少了解了一些基本概念。回到基础,它是。感谢您的反馈!
猜你喜欢
  • 1970-01-01
  • 2021-06-28
  • 2021-11-02
  • 2015-08-23
  • 2011-05-23
  • 2012-01-27
  • 2017-02-17
  • 2011-05-29
  • 1970-01-01
相关资源
最近更新 更多