重载'='不起作用

时间:2016-12-03 13:20:10

标签: c++ operator-overloading copy-constructor

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

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 Called\n";
}
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 << "= Called\n";
    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;

它没有将右侧的值复制到左侧对象并且它正在调用复制构造函数和'='运算符。请帮我解决一下这个。我怎么能继续这个?如果你愿意,我可以提供完整的源代码。

3 个答案:

答案 0 :(得分:2)

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

DJSet &operator=(const DJSet &ds)
{
    // Fill in the blank.

    return *this;
}

此外,正如所示,=运算符应采用const引用参数,而不是新的临时对象。

您需要填写空白,并执行您需要做的操作,将*this的内容替换为作为参数传递的对象的内容。

答案 1 :(得分:1)

DJSet operator=(DJSet ds) - 这会使ds参数取值,因此只要使用赋值运算符,编译器就会调用复制构造函数。将其更改为DJSet operator=(const DJSet& ds)以通过引用传递,以便代码不会在此处进行复制。

DJSet<T> djs; - 这会创建一个本地对象,其余所有代码都会修改该本地对象。在赋值运算符的末尾,本地对象被破坏,并且它上面的所有工作都被抛弃了。摆脱它。

vector<Element<T>* > vec = ds.v_; - 这会生成向量的本地副本,然后用于设置对象内的值。它不需要;你可以直接从ds.v_复制,没有这个额外的向量。摆脱它,并将djs.v_.push_back(vec[i]);更改为v_.push_back(ds.v_)

答案 2 :(得分:0)

op = jould:

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 << "= Called\n"; 
    return *this; 
}

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