如何实现赋值运算符以便多个实例共享公共数据?
How to implement an assignment operator so multiple instances share common data?
我正在开发 C++11 应用程序。我正在实施赋值运算符。
我希望如果我在赋值后修改一个值,两个对象都会被修改。
示例:
Object o1, o2;
o1.setId("id1");
o2 = o1;
o2.setId("id2");
cout << o1.getId(); ------> this returns id2
我怎样才能做到这一点?任何想法
提前致谢
使用参考:
Object o1;
o1.setId("id1");
Object &o2 = o1;
o2.setId("id2");
cout << o1.getId(); // 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
做 shallow-copy 它的内部数据:
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
据我所知,"shallow copy"不是
...if I modify one value after the assignment both objects get modified.
任何值(指针)的浅拷贝只是一个值(指针)的拷贝。
某些 class 对象的浅拷贝只是成员拷贝。
默认赋值运算符就可以了。
如果您来自类似 C# 的国家:
写的时候
Object o1;
Object o2;
您已经在内存中(在堆栈上)创建了两个独立的对象。
当你写
o2 = o1;
默认情况下你做的是浅拷贝:只是将存储在o1对应的一块内存中的所有数据复制到o2对应的内存中。就如此容易。本质上 C# 做同样的事情,唯一的区别是 o1 和 o2 是那里的引用。所以你只需将一个引用的值(不是引用所指的值!)复制到另一个引用。
所以重点是这一切都不是
...implementing assignment operator.
但复制引用或对象值本身。
在 C++ 中编写 o1
你得到的是对象值,而不是对对象的引用。
此外,在 C++ 中你不能复制引用。但是您可以复制指针。
Object* o1 = new Object;
Object* o2;
o2 = o1; // now pointing to the same object
但请记住,c++ 没有 GC,因此每次在堆上分配内存时,您必须稍后自行释放它(除非您使用智能指针,但那是另一个话题)。
我正在开发 C++11 应用程序。我正在实施赋值运算符。 我希望如果我在赋值后修改一个值,两个对象都会被修改。
示例:
Object o1, o2;
o1.setId("id1");
o2 = o1;
o2.setId("id2");
cout << o1.getId(); ------> this returns id2
我怎样才能做到这一点?任何想法
提前致谢
使用参考:
Object o1;
o1.setId("id1");
Object &o2 = o1;
o2.setId("id2");
cout << o1.getId(); // 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
做 shallow-copy 它的内部数据:
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
据我所知,"shallow copy"不是
...if I modify one value after the assignment both objects get modified.
任何值(指针)的浅拷贝只是一个值(指针)的拷贝。 某些 class 对象的浅拷贝只是成员拷贝。
默认赋值运算符就可以了。
如果您来自类似 C# 的国家:
写的时候
Object o1;
Object o2;
您已经在内存中(在堆栈上)创建了两个独立的对象。 当你写
o2 = o1;
默认情况下你做的是浅拷贝:只是将存储在o1对应的一块内存中的所有数据复制到o2对应的内存中。就如此容易。本质上 C# 做同样的事情,唯一的区别是 o1 和 o2 是那里的引用。所以你只需将一个引用的值(不是引用所指的值!)复制到另一个引用。
所以重点是这一切都不是
...implementing assignment operator.
但复制引用或对象值本身。
在 C++ 中编写 o1
你得到的是对象值,而不是对对象的引用。
此外,在 C++ 中你不能复制引用。但是您可以复制指针。
Object* o1 = new Object;
Object* o2;
o2 = o1; // now pointing to the same object
但请记住,c++ 没有 GC,因此每次在堆上分配内存时,您必须稍后自行释放它(除非您使用智能指针,但那是另一个话题)。