Подклассы и get_shared_from_this ()

Мне нужно найти решение, позволяющее подклассу получить правильный интеллектуальный указатель.

class Parent : public enable_shared_from_this {
  ...
}

class Child : public Parent {
  public Child(){
    boost::shared_ptr<Parent> pointer=shared_from_this(); // should work
    boost::shared_ptr<Child> pointer=shared_from_this(); // won't work.

  ...
}

Как получить правильный умный указатель с помощью shared_from_this ()?

КОНТЕКСТ:

Я пишу немного материала для уведомителя /слушателя, и некоторые классы, естественно, должны будут регистрироваться и отменять регистрацию в уведомителе. Например,

class Body : extends Listener<BodyMessage>{ // listen for BodyMessage messages
  public:
    Body() {
      Notifier<BodyMessage>::register(this); // register with the appropriate notifier
    }

    virtual ~Body {
      Notifier<BodyMessage>::unregister(this); // unregister
    }

    bool notify(BodyMessage m){ ... }

  ...
}

Обычно я просто использовал бы указатель this , и все было бы хорошо. Я заставил Уведомитель использовать шаблоны, поэтому я могу передавать сообщения только тем, кто хочет их услышать.

Однако я хочу использовать умные указатели. Если уведомитель выглядит так:

template<typename t>
class Notifier {
  public:
    static void register<boost::shared_ptr<Listener<t>>> boost::shared_ptr<Listener<t>> listener);

  ...
}

тогда я больше не могу использовать указатель this . Естественно, я сделал Body расширением enable_shared_from_this:

class Body : public boost::enable_shared_from_this, public Listener<BodyMessage> {
  public:
    Notifier<BodyMessage>::register(get_shared_ptr());
  ...
}

И это похоже на работу с телами. Однако это не работает для подклассов тел (или, по крайней мере, кажется, что это не так):

class BodyChild : public Body {
  public:
    BodyChild(){
      Notifier<BodyMessage>::register(get_shared_ptr());
}

скорее всего, потому что я не могу разыграть shared_pointer. ТАК, я могу сделать решение, которое

  • позволяет мне использовать общие указатели для слушателей (так как эти слушатели также используются в других контекстах интеллектуальных указателей),
  • позволяет мне создавать шаблоны уведомителей и слушателей, используя сам тип сообщения для шаблона, так что очень легко прослушивать конкретные сообщения, и мне не нужно декодировать сообщение, и
  • это просто?

Я открыт для других идей, но если я смогу заставить это работать, я буду в восторге.

7 голосов | спросил whiterook6 19 MarpmMon, 19 Mar 2012 23:45:02 +04002012-03-19T23:45:02+04:0011 2012, 23:45:02

1 ответ


0

Вы можете создавать умные указатели, а Boost предоставляет вам несколько шаблонов для облегчения этого. Например, у вас есть static_pointer_cast и dynamic_pointer_cast, которые позволяют вам разыгрывать «через» указатель.

Поскольку this имеет правильный динамический тип, вы можете вызвать boost::static_pointer_cast для возвращаемого значения shared_from_this():

boost::shared_ptr<Child> p = static_pointer_cast<Child>(shared_from_this());

(нет необходимости уточнять static_pointer_cast благодаря поиску Кенига)

ответил Alexandre C. 19 MarpmMon, 19 Mar 2012 23:48:26 +04002012-03-19T23:48:26+04:0011 2012, 23:48:26

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132