c++ STL 包含器存储重载运算符 = 的类

c++ STL containor stores a class that overloads operator =

本文关键字:运算符 的类 重载 存储 STL 包含器 c++      更新时间:2023-10-16

source

#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 的成员与 VB 完全相同,如
va[0].name 是 "Third",va[1].value 是 "four"。
但结果只是复制值(因为 A::运算符 = 只复制 A::值(
在我的项目中,A::operator= 无法更改,因为它已经使用了许多其他代码.
但是我也想使用std::container::operator=。不使用指定的复制函数.

哪种方法可以做到这一点?

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

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

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