如何实现赋值运算符,使多个实例共享公共数据



我正在开发C++11应用程序。我正在执行分配运算符。我希望如果我在赋值后修改一个值,两个对象都会被修改。

示例:

Object o1, o2;
o1.setId("id1");
o2 = o1;
o2.setId("id2");
cout << o1.getId();  ------> this returns id2

我怎样才能做到这一点?有什么想法吗

提前感谢

要允许多个实例共享一个公共对象,您可能需要使用std::shared_ptr<T>作为其内部状态:

struct Object
{
Object() : _data(new std::string()) {}
void setId(const std::string& value) { *_data = value; }
private:
std::shared_ptr<std::string> _data;
};

复制Object按照要求浅层复制其内部数据:

int main()
{
Object o1, o2;
o1.setId("1");
o2 = o1;
Object o3(o1);
o2.setId("2");
std::cout   << "o1: " << *o1._data << "n"
<< "o2: " << *o2._data << "n"
<< "o3: " << *o3._data << "n"; // Object._data set to public: for this to work
}

此打印:

2
2
2

使用引用:

Object o1;
o1.setId("id1");
Object &o2 = o1;
o2.setId("id2");
cout << o1.getId(); // id2

引用实际上是对原始对象的另一个名称。

据我所知,"浅拷贝"不是

。。。如果我在赋值后修改一个值,那么两个对象都会被修改。

任何值(指针)的浅拷贝都只是一个值(指示器)的拷贝。某个类对象的浅拷贝只是一个成员拷贝。

默认赋值运算符可以完成任务。

如果你来自一个类似C#的国家:

当你写

Object o1;
Object o2;

您已经在内存中(堆栈上)创建了两个独立对象。当你写时

o2 = o1; 

默认情况下,您执行浅层复制:只需将存储在与o1对应的内存块中的所有数据复制到与o2对应的内存中。就这么简单。从本质上讲,C#做的是一样的,唯一的区别是o1和o2是引用。因此,您只需将一个引用的值(而不是引用所指的值!)复制到另一个引用。

所以重点是这一切都与无关

。。。实现赋值运算符。

但复制引用或对象值本身。在c++编写o1时,您得到的是对象值,而不是对对象的引用。此外,在c++中,您不能复制引用。但你们可以复制指针。

Object* o1 = new Object;
Object* o2;
o2 = o1; // now pointing to the same object

但请记住,c++并没有GC,所以每次在堆上分配内存时,都必须稍后自己将其释放(除非使用智能指针,但这是另一个主题)。

最新更新