重载“=”不起作用
Overloading '=' does not work
我在编写代码时使用了“=”运算符将一个对象分配给另一个对象和一个复制构造函数。这是代码
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;
}
class DJSet 仅包含 Element<T>* 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;
它没有将右侧的值复制到左侧的对象,它正在调用复制构造函数和“=”运算符。请帮我解决一下这个。我该如何继续呢?如果你需要,我可以提供整个源代码。
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_)
.
您的操作员构造了一个新的临时对象,return存储了它。这是不正确的。根据定义,赋值运算符必须分配给 this
对象,并且 return 是对 this
:
的引用
DJSet &operator=(const DJSet &ds)
{
// Fill in the blank.
return *this;
}
此外,如前所述,=
运算符应采用 const
引用参数,而不是新的临时对象。
您将需要填写空白,并执行您需要执行的操作以将 *this
的内容替换为作为参数传递的对象的内容。
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.
应该几乎相同
我在编写代码时使用了“=”运算符将一个对象分配给另一个对象和一个复制构造函数。这是代码
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;
}
class DJSet 仅包含 Element<T>* 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;
它没有将右侧的值复制到左侧的对象,它正在调用复制构造函数和“=”运算符。请帮我解决一下这个。我该如何继续呢?如果你需要,我可以提供整个源代码。
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_)
.
您的操作员构造了一个新的临时对象,return存储了它。这是不正确的。根据定义,赋值运算符必须分配给 this
对象,并且 return 是对 this
:
DJSet &operator=(const DJSet &ds)
{
// Fill in the blank.
return *this;
}
此外,如前所述,=
运算符应采用 const
引用参数,而不是新的临时对象。
您将需要填写空白,并执行您需要执行的操作以将 *this
的内容替换为作为参数传递的对象的内容。
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.
应该几乎相同