Я работаю над приложением 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 являются там ссылками. Таким образом, вы просто копируете значение одной ссылки (а не ссылки на значение!) В другую ссылку.
Так что дело в том, что все это не о
…оператор присваивания.
но копирование ссылок или значений объекта само.
На С ++ пишу o1
Вы получаете значение объекта, а не ссылку на объект.
Более того, в c ++ нельзя копировать ссылки. Но вы можете скопировать указатель.
Object* o1 = new Object;
Object* o2;
o2 = o1; // now pointing to the same object
Но имейте в виду, что в C ++ нет GC, поэтому каждый раз, когда вы выделяете память в куче, вы должны отменить ее позднее самостоятельно (если вы не используете умные указатели, но это уже другая тема).