Параллельное и распределенное программирование на С++ (Хьюз, Хьюз) - страница 288

Обратите внимание на то, что классы istream и ostream наследуют класс ios . Класс ios поддерживает состояние потока данных и состояние буфера, используемого классами istream и ostream. Наш класс mios исполняет ту же роль в отношении класса pvm_stream. Классы istream и ostream содержат определения операторов "<<" и ">>". Эти же операторы определены и в нашем классе pvm_stream. Поэтому, хотя наш класс pvm_stream не связан с iostream-классами наследованием, между ними существует интерфейсная связь. Мы используем интерфейс iostream-классов в качестве «полуширокого» интерфейса для классов pvm_stream и mios. Обратите внимание на то, что класс mios (см. рис. 11.4) наслелуется классом pvm_stream. Если мы хотим поддерживать потоковое представление с помощью класса pvm_stream, то для этого как раз подходит понятие интерфейсного класса.

Рис. 11.4. Диаграмма классов, отображающая отношения между основными классами библиотеки iostream, и диаграмма класса pvm_stream


Перегрузка операторов "«" и "»" для PVM-потоков данных

Итак, рассмотрим определение операторов "«" и ">>" для класса pvm__stream. Оператор вставки (<<) используется для заключения в оболочку функций pvm_send () и pvm_pk. Вот как выглядит определение этого операторного метода.

>// Листинг 11.13. Определение оператора "<<" для класса

>// pvm_stream class

>pvm_stream &pvm_stream::operator<<(int Data) {

>//...

>reset();

>pvm_pkint(&Data,1,1); pvm_send(TaskId,MessageId); //.. .

>return(*this);

>}

Подобное определение существует для каждого типа данных, которые будут обрабатываться с использованием класса pvm_stream. Метод reset () унаследован от класса mios. Этот метод используется для инициализации буфера отправки д анных. TaskId и MessageId — это члены данных класса pvm_stream, которые устанавливаются с помо щ ью мето д ов taskId( ) и messageId( ). Определяемый здесь оператор вставки позволяет отправлять данные PVM-задаче с помощью стандартной записи операции вывода в поток.

>int Value = 2004;

>pvm_stream MyStream;

>//...

>MyStream << Value;

>//.. .

Оператор извлечения данных (>>) используется подобным образом, но для получения сообщений от PVM-задач. В действительности оператор ">>" заключает в оболочку функции pvm_recv () и pvmupk (). Определение этого операторного м етода выглядит так.

//> Листинг 11.14. Определение оператора для класса

>// pvm_stream

>pvm_stream &pvm_stream::operator>>(int &Data) {

>int BufId;

>//. . .

>BufId = pvm_recv(TaskId,MessageId);

>StreamState = pvm_upkint(&Data,l,l); //.. .

>return(*this);

>}

Этот тип определения позволяет получать сообщения от PVM-задач с помощью оператора извлечения данных.