重载'='不起作用

Overloading '=' does not work

本文关键字:不起作用 重载      更新时间:2023-10-16

我正在编写一个代码,我使用'='运算符将一个对象分配给另一个对象和复制构造函数。这是代码

DJSet(const DJSet& ds)
{
    vector<Element<T>* > vec= ds.v_;
    for (int i = 0; i < vec.size(); i++)
    {
        v_.push_back(vec[i]);
    }
    //cout << "Copy Calledn";
}
DJSet operator=(DJSet ds)
{
    DJSet<T> djs;
    vector<Element<T>* > vec = ds.v_;
    for (int i = 0; i < vec.size(); i++)
    {
        djs.v_.push_back(vec[i]);
    }
    cout << "= Calledn";
    return djs;
}

类DJSET仅包含一个Element<T>* type的一个向量因此,当我执行下面的代码时。

DJSet<string> djs_rhs;
    DJSet<string> djs_lhs;
    cin >> name;
    djs_rhs.add(name);
    cin >> name;
    djs_rhs.add(name);
    cin >> name;
    djs_lhs.add(name);
    cin >> name;
    djs_lhs.add(name);
    djs_lhs = djs_rhs;
    cout << djs_lhs << endl;
    cout << endl;
    cout << djs_rhs << endl;

它没有复制右侧到左侧对象的值,并且正在调用复制构造函数和'='operator。请在这件事上给予我帮助。我如何继续这样做?我可以提供整个源代码。

您的操作员构造了一个新的临时对象,并将其返回。这是不正确的。根据定义,分配运算符必须分配给this对象,然后返回this的引用:

DJSet &operator=(const DJSet &ds)
{
    // Fill in the blank.
    return *this;
}

,如所证明的,=操作员应采用const参考参数,而不是新的临时对象。

您需要填写空白,并按照您需要做的事情将*this的内容替换为作为参数传递的对象的内容。

DJSet operator=(DJSet ds)-这将逐值 ds参数,因此,每当使用分配运算符时,编译器都会调用复制构造函数。将其更改为DJSet operator=(const DJSet& ds)以通过参考将其通过,以使代码不会在此处复制。

DJSet<T> djs;-这将创建 local 对象,其余代码将修改该本地对象。在任务操作员的结束时,本地对象被摧毁,所有工作都被抛弃了。摆脱它。

vector<Element<T>* > vec = ds.v_;-这是向量的本地副本,然后将其用于在对象内部设置值。不需要;您可以直接从ds.v_复制,而无需此额外的向量。摆脱它,然后将djs.v_.push_back(vec[i]);更改为v_.push_back(ds.v_)

op = j op be:

DJSet &operator=(const DJSet &ds)
{ 
    vector<Element<T>* > vec = ds.v_; 
    for (int i = 0; i < vec.size(); i++)   
    { 
        v_.push_back(vec[i]);
    } 
    cout << "= Calledn"; 
    return *this; 
}

在您的实现中,您不是修改左对象,而是一个临时对象。通常,复制构造函数和运算符=几乎应该是相同的,除了上次返回 *this。