Пользуйтесь контрольными таблицами
Одной из причин того, что Си++ имеет такую крутую кривую обучения, заключается в том, что вы должны отслеживать большое количество деталей, чтобы выполнить даже простые задачи. Просто забыть что-то, даже если вы это сделаете не надолго. Я решаю эту проблему, применяя повсюду несколько образцовых шаблонных файлов - по одному для каждой распространенной ситуации. (У меня есть один для определения базового класса, один — для определения производного класса, и т.д.). Я начинаю с копирования соответствующего шаблона в свой текущий рабочий файл и затем использую возможности своего редактора по поиску и замене для заполнения пустот. Я также перемещаю подходящие функции в файлы .cpp, когда нужно, и т.п.. Листинги 5 и 6 показывают простые шаблонные (в смысле естественного языка, а не языка С++) файлы для базового и производного классов (где кое-что опущено по сравнению с теми, которыми я пользуюсь на самом деле, но идею вы поняли).
Листинг 5. base.tem — контрольная таблица для определения базового класса
class base
{
cls obj;
public:
virtual
~base ( void );
base ( void );
base ( const base r );
/p>
const base operator=( const base r );
private:
};
//------------------------------------------------------
/* виртуальный */ base:: ~base( void )
{
}
//------------------------------------------------------
inline base::base( void ) : obj( value )
{
}
/––-----------------------------------------------------
inline base::base( const base r ) : obj( r.obj )
{}
//------------------------------------------------------
inline const
base base::operator=( const base r )
{
if( this != r )
{
obj = r.obj;
}
return *this;
}
Листинг 6. derived.tem —
контрольная таблица для определения производного класса
class derived : public base
{
cls obj;
public:
virtual
аааааа ~derived ( void );
ааааааа derived ( void );
ааааааа derived ( const derived r );
ааа const derived operator=( const derived r );
private:
};
//------------------------------------------------------
/* тшЁЄєры№эvщ */ derived:: ~derived( void )
{
}
//------------------------------------------------------
inline derived::derived( void ) : base( value ) ,
а ааobj( value )
{
}
//------------------------------------------------------
inline derived::derived( const derived r ) : base ( r ),
ааа obj( r.obj )
{}
//------------------------------------------------------
inline const
derived derived::operator=( const derived r )
{
ааа if( this != r )
ааа {
ааааааа *((base *)this) = r;
аааааа obj = r.obj;
ааа }
ааа return *this;
}