Читаем C++ для начинающих полностью

ScreenPtr parr( *parray, arrSize ); // правильно: указывает на массив

Теперь мы готовы определить в ScreenPtr перегруженные операторы инкремента и декремента. Однако они бывают двух видов: префиксные и постфиксные. К счастью, можно определить оба варианта. Для префиксного оператора объявление не содержит ничего неожиданного:

class ScreenPtr {

public:

Screen& operator++();

Screen& operator--();

// ...

};

Такие операторы определяются как унарные операторные функции. Использовать префиксный оператор инкремента можно, к примеру, следующим образом: const int arrSize = 10; Screen *parray = new Screen[ arrSize ]; ScreenPtr parr( *parray, arrSize ); for ( int ix = 0; ix

Определения этих перегруженных операторов приведены ниже:

Screen& ScreenPtr::operator++()

{

if ( size == 0 ) {

cerr "не могу инкрементировать указатель для одного объекта\n";

return *ptr;

}

if ( offset = size - 1 ) {

cerr "уже в конце массива\n";

return *ptr;

}

++offset;

return *++ptr;

}

Screen& ScreenPtr::operator--()

{

if ( size == 0 ) {

cerr "не могу декрементировать указатель для одного объекта\n";

return *ptr;

}

if ( offset = 0 ) {

cerr "уже в начале массива\n";

return *ptr;

}

--offset;

return *--ptr;

}

Чтобы отличить префиксные операторы от постфиксных, в объявлениях последних имеется дополнительный параметр типа int. В следующем фрагменте объявлены префиксные и постфиксные варианты операторов инкремента и декремента для класса ScreenPtr:

class ScreenPtr {

public:

Screen& operator++(); // префиксные операторы

Screen& operator--();

Screen& operator++(int); // постфиксные операторы

Screen& operator--(int);

// ...

};

Ниже приведена возможная реализация постфиксных операторов:

Screen& ScreenPtr::operator++(int)

{

if ( size == 0 ) {

cerr "не могу инкрементировать указатель для одного объекта\n";

return *ptr;

}

if ( offset == size ) {

cerr "уже на один элемент дальше конца массива\n";

return *ptr;

}

++offset;

return *ptr++;

}

Screen& ScreenPtr::operator--(int)

{

if ( size == 0 ) {

cerr "не могу декрементировать указатель для одного объекта\n";

return *ptr;

}

if ( offset == -1 ) {

cerr "уже на один элемент раньше начала массива\n";

return *ptr;

}

--offset;

return *ptr--;

}

Обратите внимание, что давать название второму параметру нет необходимости, поскольку внутри определения оператора он не употребляется. Компилятор сам подставляет для него значение по умолчанию, которое можно игнорировать. Вот пример использования постфиксного оператора:

const int arrSize = 10;

Screen *parray = new Screen[ arrSize ];

ScreenPtr parr( *parray, arrSize );

for ( int ix = 0; ix

При его явном вызове необходимо все же передать значение второго целого аргумента. В случае нашего класса ScreenPtr это значение игнорируется, поэтому может быть любым:

parr.operator++(1024); // вызов постфиксного operator++

Перегруженные операторы инкремента и декремента разрешается объявлять как дружественные функции. Изменим соответствующим образом определение класса ScreenPtr:

class ScreenPtr {

// объявления не членов

friend Screen& operator++( Screen & ); // префиксные операторы

friend Screen& operator--( Screen & );

friend Screen& operator++( Screen &, int); // постфиксные операторы

friend Screen& operator--( Screen &, int);

public:

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных