【问题标题】:c++ STL containor stores a class that overloads operator =c++ STL容器存储了一个重载operator =的类
【发布时间】: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;

}

点 Tstd::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


【解决方案1】:

有责任以这样一种方式实现赋值运算符:在赋值后 a = b; 对象 a 与对象 b 具有相同的语义。

如果你真的做不到,那么也许你可以依赖隐式定义的复制构造函数:

std::vector<A>(vb).swap(va);
//   ^^^^^^^^^^^^^
//    copy of vb

【讨论】:

  • +1:维护明确指定的赋值运算符是您的问题
  • 嗯,我理解 operator= 的意思是'从左到右一样'。我需要将我的整个代码重构为:替换每个 A::operator= ,这意味着部分复制到指定的复制函数。并且仅使用 A::operator= 意味着“从左到右制作相同”。感谢您的建议,对不起,我的英语简短......
猜你喜欢
  • 2011-02-12
  • 2018-01-01
  • 2019-04-30
  • 2010-12-14
  • 2012-05-03
  • 2012-03-08
  • 2021-06-18
  • 2012-01-29
  • 1970-01-01
相关资源
最近更新 更多