【问题标题】:Overloading '=' does not work重载'='不起作用
【发布时间】:2016-12-03 13:20:10
【问题描述】:

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

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&lt;T&gt;* type 的一个 Vector 所以当我执行下面的代码时。

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;

它没有将右侧的值复制到左侧的对象,它同时调用了复制构造函数和“=”运算符。请帮我解决一下这个。我怎样才能继续这个?如果你愿意,我可以提供整个源代码。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      DJSet operator=(DJSet ds) - 它按值接受ds 参数,因此无论何时使用赋值运算符,编译器都会调用复制构造函数。改成DJSet operator=(const DJSet&amp; ds)引用传递,这样代码就不会复制到这里了。

      DJSet&lt;T&gt; djs; -- 这将创建一个 local 对象,所有其余代码都会修改该本地对象。在赋值运算符结束时,本地对象被销毁,所有在它上面的工作都被丢弃了。摆脱它。

      vector&lt;Element&lt;T&gt;* &gt; vec = ds.v_; - 这会生成向量的本地副本,然后用于在对象内部设置值。不需要;你可以直接从ds.v_ 复制,不需要这个额外的向量。去掉它,把djs.v_.push_back(vec[i]);改成v_.push_back(ds.v_)

      【讨论】:

        【解决方案3】:

        op= 应该是:

        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= 应该几乎相同,除了最后一个 return *this。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-02-19
          • 2017-03-13
          • 2012-04-29
          • 1970-01-01
          • 1970-01-01
          • 2017-05-18
          • 2017-12-29
          相关资源
          最近更新 更多