【发布时间】:2012-01-19 16:44:23
【问题描述】:
来源
#include <iostream>
#include <vector>
#include <string>
class A
{
public:
std::string name;
int value;
A& operator = (const A& from) { value=from.value; return *this; }
A(std::string a_name, int a_val) { name=a_name; value=a_val; }
};
int main()
{
std::vector<A> va;
va.push_back(A("first",1));
va.push_back(A("second",2));
std::vector<A> vb;
vb.push_back(A("third",3));
vb.push_back(A("fourth",4));
va = vb; //point T
return 0;
}
在点 T,std::vector::operator= 调用每个存储成员的重载运算符 A::operator=
结果不是我想要的。
我的预期结果是:
在点T之后,va的成员与
va[0].name完全相同的vb > 是“第三”,va[1].value 是“第四”。
但结果只是复制了值(因为 A::operator= 只复制了 A::value)
在我的项目中,A::operator= 无法更改,因为它已经使用了许多其他代码。
但我也想使用 std::container::operator=。不使用指定的复制功能。
哪种方式可以做到这一点?
【问题讨论】:
-
A类的构造函数写得不好(没有初始化列表),所以我不会说维护这个类听起来很值得。如果这是任何迹象,那么您正在使用的代码库可能整个质量都很低,并且可以从重写中受益。 -
如果你的赋值操作符做了部分复制,那么你的原始设计有缺陷是一个很好的建议。
-
听起来您当前的
operator=需要重命名为setValueFrom()之类的名称。您可以尝试滥用运算符重载,但如果您遇到诸如赋值错误之类的基本问题,语言就会反击。 - 尝试为此类禁用operator=(通过从不可分配的基类继承),以便您可以找到所有使用它的地方?
标签: c++ vector operator-overloading std stdvector