#c
#c
Вопрос:
можно ли заменить объект в a std::vector
другим объектом того же типа и сохранить любые ссылки на этот объект, который был только что заменен?
Допустим, у нас есть
std::vector<MyObj> objs
и я хочу заменить MyObj
объект -object таким образом, чтобы все ссылки на него MyObj
остались нетронутыми — возможно ли это?
Комментарии:
1. Похоже, вам нужен вектор указателей на эти объекты, а не вектор объектов
Ответ №1:
Вы не можете сделать это в целом без серьезного неправильного использования языка (например, используя placement new в ситуации, для которой он не был разработан). Однако вы можете спроектировать MyObj
класс таким образом, чтобы сделать реализацию этого варианта использования очень простой. Например, если MyObj
следовать идиоме Envelope и Letter, которая помещает реализацию (письмо) и ее оболочку (конверт) в отдельные классы, вы можете создать массив оболочек и заменить их внутреннее содержимое, не нарушая внешние ссылки:
// The real functionality goes here
struct MyObjImpl {
void operation1() { ... }
void operation2() { ... }
};
// This is a wrapper that forwards calls to the implementation,
// which can be switched at any time without disturbing references to MyObj
class MyObj {
MyObjImpl* wrapped;
public:
MyObj(MyObjImpl* rep) : wrapped(rep) {}
void switch(MyObjectImpl* rep) {
wrapped = rep;
}
void operation1() { wrapped->operation1(); }
void operation2() { wrapped->operation2(); }
};
Ответ №2:
Предполагая, что единственный способ «заменить» объект — назначить ему, тогда на самом деле маловероятно, что какие-либо ссылки на назначенный объект будут признаны недействительными в первую очередь.
То есть ответ таков: вам не нужно делать ничего особенного. Все ссылки на «замененный» объект остаются нетронутыми.
Конечно, есть и другие причины, по которым ссылки на объект, хранящийся в a std::vector
, становятся недействительными, но они не происходят во время корректного присвоения удерживаемому объекту.
Ответ №3:
Возможно, вы захотите сохранить состояния замененных объектов с помощью memento pattern
as it’s called или просто save state
управляющего объекта. Ссылка на memento
from wiki
https://en.wikipedia.org/wiki/Memento_pattern поскольку в нем отсутствует C
реализация, его просто написать. Кроме того, вы можете захотеть отслеживать замененные объекты, поэтому можете немного расширить его.