Программирование >>  Инициализация объектов класса, структура 

1 ... 310 311 312 [ 313 ] 314 315 316 ... 395


#include IntArray.h

class PeekbackStack : public IntAArray { private:

public:

private:

const int static bos = -1;

explicit PeekbackStack( int size )

: IntArray( size ), top( bos ) {}

bool empty() const { return top == bos; } bool full() const { return top == size()-1; } int top() const { return top; }

int pop() { if ( empty() )

/* ia6aai6a6u 10ёаё6 */ ; return ia[ top- ]; }

void push( int value ) {

if ( full() )

/* 1абаа1ба6й 10ёаё6 */ ; ia[ ++ top ] = value;

bool peekback( int index, int Svalue ) const; int top;

inline bool

PeekbackStack::

peekback( int index, int Svalue ) const {

if ( empty() )

/* 1абаа1ба6й 10ёаё6 */ ;

if ( index < 0 index > top )

value = ia[ top ] ; return false; }

value = ia[ index ] ; return true;

сожалению, программа, которая работает с нашим новым классом PeekbackStack,

extern void swap( IntAArrayS, int, int ); PeekbackStack is( 1024 );

1ai6aaaeaa11ia 10ёа1+11а ёп11ёйд1аа1ёа PeekbackStack swap(is, i, j);

is.sort();

может неправильно использовать открытый интерфейс базового IntArray:

is[0] = is[512];



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

Проблема в том, что открытое наследование описывается как отношение ЯВЛЯЕТСЯ . Но PeekbackStack не является разновидностью массива IntArray, а лишь включает его как часть своей реализации. Открыт1й интерфейс IntArray не должен входить в открытый интерфейс PeekbackStack.

Закрытое наследование от базового класса представляет собой вид наследования, который нельзя описать в терминах подтипов. В производном классе открытый интерфейс базового становится закрытым. Все показанные выше примеры использования объекта PeekbackStack становятся допустимыми только внутри функций-членов и друзей производного класса.

В приведенном ранее определении PeekbackStack достаточно заменить слово public в списке базовых классов на private. Внутри же самого определения класса public и private следует оставить на своих местах:

class PeekbackStack : private IntAArray { ... };

18.3.1. Наследование и композиция

Реализация класса PeekbackStack с помощью закрытого наследования от IntArray работает, но необходимо ли это? Помогло ли нам наследование в данном случае? Нет.

Открытое наследование - это мощный механизм для поддержки отношения ЯВЛЯЕТСЯ . Однако реализация PeekbackStack но отношению к IntArray - пример отношения СОДЕРЖИТ . Класс PeekbackStack содержит класс IntArray как часть своей реализации. Отношение СОДЕРЖИТ , как правило, лучше поддерживается с помощью композиции, а не наследования. Для ее реализации надо один класс сделать членом другого. В нашем случае объект IntArray делается членом PeekbackStack. Вот реализация PeekbackStack на основе композиции:



class PeekbackStack { private:

const int static bos = -1;

public:

explicit PeekbackStack( int size ) : stack( size ), top( bos ) {}

bool empty() const { return top == bos; } bool full() const { return top == size()-1; } int top() const { return top; }

int pop() { if ( empty() )

/* обработать ошибку */ ; return stack[ top- ]; }

void push( int value ) {

if ( full() )

/* обработать ошибку */ ; stack[ ++ top ] = value; }

bool peekback( int index, int Svalue ) const;

private:

int top; IntArray stack;

inline bool PeekbackStack::

peekback( int index, int Svalue ) const {

if ( empty() )

/* обработать ошибку */ ;

if ( index < 0 index > top ) {

value = stack[ top ]; return false; }

value = stack[ index ]; return true;

Решая, следует ли использовать при проектировании класса с отношением СОДЕРЖИТ композицию или закрытое наследование, можно руководствоваться такими соображениями:

если м1 хотим заместить какие-либо виртуальные функции базового класса, то должны закрыто наследовать ему;

если мы хотим разрешить нашему классу ссылаться на класс из иерархии типов, то должны использовать композицию по ссылке (мы подробно расскажем о ней в разделе 18.3.4);

если, как в случае с классом PeekbackStack, мы хотим воспользоваться готовой реализацией, то композиция по значению предпочтительнее наследования. Если



1 ... 310 311 312 [ 313 ] 314 315 316 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика