|
Программирование >> Инициализация объектов класса, структура
#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, мы хотим воспользоваться готовой реализацией, то композиция по значению предпочтительнее наследования. Если
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |