0

Я работаю с симуляцией. Каждая порожденная частица имеет слот для указателя на объект UserInfo (чтобы вы могли прикрепить любую информацию, которая вам нужна частице). Проблема в том, что структура удаляет эту информацию пользователя всякий раз, когда частица убивается. Поскольку существует много миллионов частиц, часто с дублирующейся информацией, я хочу создать новый объект UserInfo, когда информация отличается. Проблема, конечно, в том, что всякий раз, когда частица убивается, она удаляет объект UserInfo, на который у него есть указатель (независимо от того, прикреплен ли этот же объект к какой-либо другой частице.)Удалить только по последней ссылке, CRTP

Какие шаги необходимо предпринять чтобы Particle не удалял объект UserInfo при уничтожении частицы? Я понимаю, что мне нужно сделать подсчет ссылок и перегрузить delete для моего класса UserInfo. Тем не менее, я никогда не перегружен удалить, прежде чем это у меня есть несколько вопросов:

  1. Если у меня есть иерархия классов, как:

    class VirtualUserInfo; 
    class A : public VirtualUserInfo; 
    class B : public A 
    ...etc 
    

    и я перегружать удалить в классе А, он будет работать, если удаление вызывается на указатель на VirtualUserInfo или на указатель на класс B? (Очень похоже, как вы можете перегружать новую для правильной работы? Нужно ли снова перегружать новую для каждого нового производного класса?)

  2. Легко сделать подсчет ссылок с любопытно повторяющимся шаблоном шаблона. Есть ли способ включить поведение удаления в такой стиль в стиле mixin? Было бы неплохо применить этот тип поведения к любому типу UserInfo, который я должен был написать.

  3. Есть ли более прохладный/лучший способ делать то, что я хочу?

+3

Похоже, что вам нужен умный указатель. Для этой цели для C++ используется 'std :: shared_ptr'. – Asha

+0

Могу я использовать умный указатель в любом месте, где бы я использовал обычный указатель? Потому что мне нужно будет использовать метод someFrameworkClass :: setUserInfo (VirtualUserInfo * myUserInfo); – user487100

+0

Да, но обратите внимание, что существуют различные типы интеллектуальных указателей. Взгляните сюда для получения дополнительной информации: http://stackoverflow.com/questions/106508/what-is-a-smart-pointer-and-when-should-i-use-one Для получения исходного указателя из интеллектуального указателя вы должны использовать такие методы, как 'get'. – Asha

ответ

0

Зачем вам crtp ?? Использование можно использовать shared_ptr в новой стандартной или повышающей библиотеке, также вы можете реализовать свои собственные подсчет ссылок смарта-указатель, если ваш компилятор не поддерживает повышение или новый стандарт, просто посмотри здесь: http://code.google.com/p/tnnlib/source/browse/trunk/%20tnnlib/Utilities/Utilities/SmartPtr/SmartPtr.h

0

Я не знаете, зачем вам нужен класс-оболочка ... неужели вы не можете изменить интерфейс класса Particle? Часть указатель на UserInfo будет просто выглядеть следующим образом:

class Particle { 
    std::shared_ptr<VirtualUserInfo> mpUserInfo; 
public: 
    Particle(std::shared_ptr<VirtualUserInfo> UserInfo): 
     mpUserInfo(UserInfo) 
    {} 
}; 

Все, что вы пытаетесь реализовать себя, скорее всего, просто дублировать то, что уже доступно с std::shared_ptr, и это может оказаться больше работы, чем изменить свой интерфейс ,