Обратите внимание на то, что классы 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-задач с помощью оператора извлечения данных.