|
Программирование >> Инициализация объектов класса, структура
#include <iostream> #include <string> #include Screen.h void printScreen( const ScreenPtr sps ) { cout << Screen Cbject ( << ps->height() << , << ps->width() << )\n\n ; for ( int ix = 1; ix <= ps->height(); ++ix ) { for ( int iy = 1; iy <= ps->width(); ++iy ) cout << ps->get( ix, iy ); cout << \n ; int main() { Screen sobj( 2, 5 ); string init( HelloWorld ); ScreenPtr ps( sobj ); Установить содержимое экрана string::size type initpos = 0; for ( int ix = 1; ix <= ps->height(); ++ix ) for ( int iy = 1; iy <= ps->width(); ++iy ) ps->move( ix, iy ); ps->set( init[ initpo :)os++ ] ); Вести содержимое экрана printScreen( ps ); return 0; Разумеется, подобные манипуляции с указателями на объекты классов не так эффективны, как работа со встроенными указателями. Поэтому интеллектуальный указатель должен предоставлять дополнительную функциональность, важную для приложения, чтобы оправдать сложность своего использования. 15.7. Операторы инкремента и декремента Продолжая развивать реализацию класса ScreenPtr, введенного в предыдущем разделе, рассмотрим еще два оператора, которые поддерживаются для встроенных указателей и которые желательно иметь и для нашего интеллектуального указателя: инкремент (++) и декремент (--). Чтобы использовать класс ScreenPtr для ссылки на элементы массива объектов Screen, туда придется добавить несколько дополнительных членов. Сначала мы определим новый член size, который содержит либо нуль (это говорит о том, что объект ScreenPtr указывает на единственный объект), либо размер массива, адресуемого объектом ScreenPtr. Нам также понадобится член offset, запоминающий смещение от начала данного массива: class ScreenPtr { public: public: ... private: int size; размер массива: 0, ес единственна объект int offset; смещение ptr от начала массива Screen *ptr; Модифицируем конструктор класса ScreenPtr с учетом его новой функциональности и дополнительных членов,. Пользователь нашего класса должен передать конструктору class ScreenPtr { public: ScreenPtr( Screen ss , int arraySize = 0 ) : ptr( ss ), size ( arraySize ), offset( 0 ) { } private: int size; int offset; Screen *ptr; дополнительный аргумент, если создаваемый объект указывает на массив: С помощью этого аргумента задается размер массива. Чтобы сохранить прежнюю функциональность, предусмотрим для него значение по умолчанию, равное нулю. Таким образом, если второй аргумент конструктора опущен, то член size окажется равен 0 и, следовательно, такой объект будет указывать на единственный объект Screen. Объекты Screen myScreen( 4, 4 ); ScreenPtr pobj( myScreen ); правильно: указывает на один объект const int arrSize = 10; Screen *parray = new Screen[ arrSize ]; нового класса ScreenPtr можно определять следующим образом: ScreenPtr parr( *parray, arrSize ); правильно: указывает на массив Теперь мы готовы определить в ScreenPtr перегруженные операторы инкремента и декремента. Однако они бывают двух видов: префиксные и постфиксные. К счастью, можно определить оба варианта. Для префиксного оператора объявление не содержит class ScreenPtr { public: Screens operator++(); Screens operator--(); ... ничего неожиданного: }; Такие операторы определяются как унарные операторные функции. Использовать префиксный оператор инкремента можно, к примеру, следующим образом: const int arrSize = 10; Screen *parray = new Screen[ arrSize ]; ScreenPtr parr( *parray, arrSize ); for ( int ix = 0; ix < arrSize; ++ix, ++parr ) эквивалентно parr.operator++() printScreen( parr ); Screens ScreenPtr::operator++() { if ( size == 0 ) { cerr << не могу инкрементировать указатель для одного объекта\n ; return *ptr; if ( offset >= size - 1 ) { cerr << уже в конце массива\n ; return *ptr; ++offset; return *++ptr; Screens ScreenPtr::operator--() { if ( size == 0 ) { cerr << не могу декрементировать указатель для одного объекта\n ; return *ptr; if ( offset <= 0 ) { cerr << уже в начале массива\n ; return *ptr; --offset; return *-ptr; Определения этих перегруженных операторов приведены ниже: Чтобы отличить префиксные операторы от постфиксных, в объявлениях последних имеется дополнительный параметр типа int. В следующем фрагменте объявлены префиксные и постфиксные варианты операторов инкремента и декремента для класса class ScreenPtr { public: Screens operator++(); префиксные операторы Screens operator--(); Screens operator++(int); постфикснхе операторы Screens operator--(int); ... ScreenPtr:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |