C : заменить объект в std :: vector «на месте» новым объектом того же типа, но сохранить ссылки на этот объект

#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 реализация, его просто написать. Кроме того, вы можете захотеть отслеживать замененные объекты, поэтому можете немного расширить его.