Правила программирования на Си и Си++



         

144. Не вызывайте конструкторов из операции operator=( ) - часть 2


указывает на таблицу производного класса. После присваивания указатель vtable

указывает на таблицу базового класса; он был переинициализирован неявным вызовом конструктора при вызове new в перегруженной операции operator=().

Таким образом, вызовы конструкторов в операции operator=()

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

Лучшим способом устранения дублирования кода в операции присваивания operator=()

является использование простой вспомогательной функции:

class some_class

{

   void create  ( void                );

   void create  ( const some_class &r );

   void destroy ( void                );

public:

   virtual

      ~some_class( void

) { destroy(); }

       some_class( void

) { create();  }

   const some_class &operator=( const some_class &r );

};

inline const some_class &some_class::operator=( const

some_class &r )

{

   destroy();

   create( r );

}

inline some_class::some_class( void )

{

   create();

}

~some_class::some_class( void )

{

   destroy();

}

Часть 8е. Перегрузка операций




Содержание  Назад  Вперед