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

时间:2017-02-02 20:17:27

标签: c++ c++11 operator-overloading assignment-operator shallow-copy

我正在研究C ++ 11应用程序。我正在实施赋值运算符。 我希望如果我在赋值后修改一个值,则两个对象都会被修改。

示例:

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

我怎么能实现这一目标?任何想法

提前致谢

3 个答案:

答案 0 :(得分:4)

要允许多个实例共享公共对象,您可能希望使用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

答案 1 :(得分:1)

使用参考:

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

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

答案 2 :(得分:-2)

据我所知,“浅拷贝”不是

  

...如果我在赋值后修改了一个值,则两个对象都会被修改。

任何值(指针)的浅拷贝只是值(指针)的副本。 某些类对象的浅拷贝只是一个成员副本。

默认赋值运算符可以解决问题。

如果你来自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,所以每次在堆上分配内存时,你必须自己稍后处理它(除非你使用智能指针,但那是另一个主题)。