Как реализовать оператор присваивания, чтобы несколько экземпляров совместно использовали общие данные?

Я работаю над приложением C ++ 11. Я реализую оператор присваивания.
Я хочу, чтобы, если я изменил одно значение после присваивания, оба объекта были изменены.

Пример:

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

Как я мог этого добиться? есть идеи

заранее спасибо

-2

Решение

Чтобы разрешить нескольким экземплярам совместно использовать общий объект, вы можете использовать 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
4

Другие решения

Используйте ссылку:

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

Ссылка — это фактически другое имя исходного объекта.

1

Насколько я знаю, «мелкая копия» не

…если я изменяю одно значение после присваивания, оба объекта модифицируются.

Мелкая копия любого значения (указатель) — это просто копия значения (указатель).
Мелкая копия некоторого объекта класса — это просто членская копия.

Оператор присваивания по умолчанию делает свое дело.

В случае, если вы пришли из C # -подобной земли:

Когда ты пишешь

Object o1;
Object o2;

вы уже создали два независимых объекта в памяти (в стеке).
А когда пишешь

o2 = o1;

по умолчанию вы делаете поверхностную копию: просто скопируйте все данные, хранящиеся в куске памяти, соответствующей o1, в память, соответствующую o2. Так просто. По сути, C # делает то же самое, единственное отличие состоит в том, что o1 и o2 являются там ссылками. Таким образом, вы просто копируете значение одной ссылки (а не ссылки на значение!) В другую ссылку.

Так что дело в том, что все это не о

…оператор присваивания.

но копирование ссылок или значений объекта само.
На С ++ пишу o1 Вы получаете значение объекта, а не ссылку на объект.
Более того, в c ++ нельзя копировать ссылки. Но вы можете скопировать указатель.

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

Но имейте в виду, что в C ++ нет GC, поэтому каждый раз, когда вы выделяете память в куче, вы должны отменить ее позднее самостоятельно (если вы не используете умные указатели, но это уже другая тема).

-2
По вопросам рекламы [email protected]