Удалить только по последней ссылке, CRTP - PullRequest
0 голосов
/ 23 февраля 2012

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

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

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

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

    и я перегружаю удаление в классе A, будет ли оно работать, если удаление вызывается по указателю на VirtualUserInfo или по указателю на класс B? (Точно так же, как вы можете перегрузить new для правильной работы? Вам нужно перегрузить new заново для каждого нового производного класса?)

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

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

Ответы [ 2 ]

0 голосов
/ 20 августа 2015

Я не уверен, зачем вам нужен класс-обёртка ... разве вы не можете изменить интерфейс класса частиц? Часть указателя на userinfo будет выглядеть так:

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

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

0 голосов
/ 28 февраля 2012

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

...