eao197 on the Web
Сайт Евгения Охотникова
[ Главная | Проекты | Описания | Об авторе | Лицензия ]

C++ tricks: this_in_constructor

Компилятор Visual C++ выдает предупреждение, если встречает код следующего вида:

class my_tag_t : public tag_t
  {
  private :
    some_attr_t m_attr;

  public :
    my_tag_t()
      :  m_attr( this )
      { ... }
  ...
  };

Предупреждение компилятора говорит о том, что this используется в списке инициализации базовых членов класса. Ничего страшного, конечно, в этом предупреждении нет. Но его появление не очень приятно.

Описываемый ниже фокус я придумал не сам, а где-то прочитал. Но, т.к. я уже не помню где, а фокус мне нравится, то я решил описать его здесь.

Данная проблема возникает, например, в иерархиях классов, подобных следующией:

class tag_t { ... };
class paragraph_tag_t : public tag_t
  {
  public :
    paragraph_tag_t(
      // Какому тегу принадлежит.
      tag_t & owner, ... );
  ...
  };
class unordered_list_tag_t : public tag_t
  {
  public :
    unordered_list_tag_t(
      // Какому тегу принадлежит.
      tag_t & owner, ... );
  ...
  };
...
class my_tag_t : tag_t
  {
  private :
    paragraph_tag_t m_short_description;
    unordered_list_tag_t m_detailed_description;
    ...
  public :
    my_tag_t()
      :  m_short_description(
           // Мы владеем этим тегом.
           this, ... )
      ,  m_detailed_description(
           // Мы владеем этим тегом.
           this, ... )
      {}
  ...
  };

Для того, чтобы избавиться от предупреждения компилятора достаточно в вершине иерархии наследования определить метод self_tag():

class tag_t
  {
  public :
    inline tag_t &
    self_tag()
      {
        return *this;
      }
    ...
  };
...
class my_tag_t : tag_t
  {
  private :
    paragraph_tag_t m_short_description;
    unordered_list_tag_t m_detailed_description;
    ...
  public :
    my_tag_t()
      :  m_short_description(
           // Мы владеем этим тегом.
           self_tag(), ... )
      ,  m_detailed_description(
           // Мы владеем этим тегом.
           self_tag(), ... )
      {}
  ...
  };

© 2003-2004 Е.А. Охотников
$LastChangedDate: 2004-10-28 08:44:53 +0400 (Thu, 28 Oct 2004) $
e-mail



Hosted by uCoz