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