Я работаю с симуляцией. Каждая порожденная частица имеет слот для указателя на объект UserInfo (чтобы вы могли прикрепить любую информацию, которая вам нужна частице). Проблема в том, что структура удаляет эту информацию пользователя всякий раз, когда частица убивается. Поскольку существует много миллионов частиц, часто с дублирующейся информацией, я хочу создать новый объект UserInfo, когда информация отличается. Проблема, конечно, в том, что всякий раз, когда частица убивается, она удаляет объект UserInfo, на который у него есть указатель (независимо от того, прикреплен ли этот же объект к какой-либо другой частице.)Удалить только по последней ссылке, CRTP
Какие шаги необходимо предпринять чтобы Particle не удалял объект UserInfo при уничтожении частицы? Я понимаю, что мне нужно сделать подсчет ссылок и перегрузить delete для моего класса UserInfo. Тем не менее, я никогда не перегружен удалить, прежде чем это у меня есть несколько вопросов:
Если у меня есть иерархия классов, как:
class VirtualUserInfo; class A : public VirtualUserInfo; class B : public A ...etc
и я перегружать удалить в классе А, он будет работать, если удаление вызывается на указатель на VirtualUserInfo или на указатель на класс B? (Очень похоже, как вы можете перегружать новую для правильной работы? Нужно ли снова перегружать новую для каждого нового производного класса?)
Легко сделать подсчет ссылок с любопытно повторяющимся шаблоном шаблона. Есть ли способ включить поведение удаления в такой стиль в стиле mixin? Было бы неплохо применить этот тип поведения к любому типу UserInfo, который я должен был написать.
Есть ли более прохладный/лучший способ делать то, что я хочу?
Похоже, что вам нужен умный указатель. Для этой цели для C++ используется 'std :: shared_ptr'. – Asha
Могу я использовать умный указатель в любом месте, где бы я использовал обычный указатель? Потому что мне нужно будет использовать метод someFrameworkClass :: setUserInfo (VirtualUserInfo * myUserInfo); – user487100
Да, но обратите внимание, что существуют различные типы интеллектуальных указателей. Взгляните сюда для получения дополнительной информации: http://stackoverflow.com/questions/106508/what-is-a-smart-pointer-and-when-should-i-use-one Для получения исходного указателя из интеллектуального указателя вы должны использовать такие методы, как 'get'. – Asha