为什么复制分配push_back元素到现有对象?

Why the copy assignment push_back element to the existing object?

提问人:Jacob 提问时间:4/16/2023 更新时间:4/16/2023 访问量:44

问:

我创建了一个名为 Sentence 的类:

class
Sentence {
public:
    vector<Clause> Clause_arr;
    Sentence() {};
    Sentence(const Sentence& s) {
        for(int i = 0; i < s.Clause_arr.size(); i++) {
            Clause_arr.push_back(s.Clause_arr[i]);
        }
    }
    Sentence& operator = (const Sentence& s) {
        for(int i = 0; i<s.Clause_arr.size(); i++) {
            Clause c = s.Clause_arr[i];
            Clause_arr.push_back(c);
        }
        return *this;
    }

    Sentence(vector<Clause> a) {Clause_arr = a;}
    Sentence operator +(const Sentence& x) {
        if(x.Clause_arr.size() == 0 && Clause_arr.size() == 0) {
            Clause x;
            Sentence ans;
            ans.Clause_arr.push_back(x);
            return ans;
        }
        vector<Clause> a={};
        a.insert(a.end(),Clause_arr.begin(),Clause_arr.end());
        a.insert(a.end(),x.Clause_arr.begin(),x.Clause_arr.end());
        Sentence ans(a);
        return ans;
    }
    bool operator ==(const Sentence& x) const {
       if(x.Clause_arr.size() != Clause_arr.size()) return false;
       for(int i = 0; i < x.Clause_arr.size(); i++) {
           if(x.Clause_arr[i] != Clause_arr[i]) return false;
       }
       return true;
    }

    bool operator !=(const Sentence& x) const {
        return (*this != x);
    }
};

我创建了句子 a 和句子 b,但是当我执行 a = b 时,我发现它正好给了我 a + b 的结果

我想知道如何更改我的代码以准确实现复制分配。我是否需要更改构造函数或复制赋值函数?

C++ 复制构造函数

评论

1赞 Chris 4/16/2023
您能向我们展示预期与实际输出吗?一个最小的可重现示例main
0赞 Kevin 4/16/2023
提示:开头的内容是什么?顺便说一句,我认为你根本不需要为这个类定义一个自定义。默认的就可以了。this->Clause_arroperator=operator=
0赞 Kevin 4/16/2023
您的许多其他功能也可以简化。你可以只是.您也不需要自定义复制构造函数或默认值。operator==return Clause_arr == x.Clause_arr;
0赞 Jacob 4/16/2023
我认为如果我使用默认 = ,它是移动分配,实际上在这个程序中,我需要复制分配。@Kevin
0赞 PaulMcKenzie 4/16/2023
@Jacob -- 我想如果我使用默认值 = -- 否。如前所述,程序不需要任何用户定义的复制赋值运算符或复制构造函数。你对这些代码所做的只是让它更有可能引入一个错误。编译器的默认值是完全可以的。除了 之外,大部分代码都是不必要的。operator+

答:

0赞 Chris 4/16/2023 #1

听起来您需要先清除实例中实例变量中的内容,然后再将同一实例变量的内容推回 。Clause_arrab

    Sentence& operator = (const Sentence& s) {
        Clause_arr.clear();
        for(int i = 0; i<s.Clause_arr.size(); i++) {
            Clause c = s.Clause_arr[i];
            Clause_arr.push_back(c);
        }
        return *this;
    }

您也可以使用基于范围的 for 循环。

    Sentence& operator = (const Sentence& s) {
        Clause_arr.clear();
        for (auto c : s.Clause_arr) {
            Clause_arr.push_back(c);
        }
        return *this;
    }