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) $