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

и класс pvm_stream можно использовать многократно, и оба они поддерживают параллельное программирование. Предполагается, что объекты класса pvm_stream должны использоваться PVM-задачами при отправке и приеме сообщений. Но это не является жестким требованием. Для того чтобы пользователь мог применить концепцию класса pvm_stream к своим классам, для них необходимо определить операторы вставки (<<) и извлечения (>>).

Пользовательские классы, создаваемые для обработки PVM-потоков данных

Чтобы понять, как определенный пользователем класс можно использовать совместно с классом pvm_stream, попробуем усовершенствовать возможности PVM-палитры, представленной в главе 6. Класс палитры представляет простую коллекцию цветов. Для удобства будем сохранять цвета в векторе строк (vector) с именем Colors.

Начне м с объявления класса spectral_palette, который содержит friend- объявления дл я операторов вставки (<<) и извлечени я (>>).

>// Листинг 11.16. Объявление класса spectral_palette

>class spectral_palette : public pvm_object{

>protected:

>//. . .

>vector Colors;

>public:

>spectral_palette(void);

>//...

>friend pvm_stream &operator>>(pvm_stream &In,spectral_palette &Obj);

>friend pvm_stream &operator<<(pvm_stream &Out,spectral_palette &Obj);

>//. . .

Обратите внимание на то, что класс spectral_palette в листинге 11.16 наследует класс pvm_object. Класс pvm_object тем самым обеспечивает своего наследника доступом к идентификатору задачи и идентификатору сообщения. Вспомните, что идентификаторы задачи и сообщения используются во многих PVM-функциях. С помощью определения операторов вставки (<<) и извлечения (>>) объекты класса spectral_palette можно пересылать между параллельно выполняемыми PVM-задачами. Метод, используемый для класса spectral_palette, очень прост, и его можно так же успешно применить к любому пользовательскому классу. Поскольку класс pvm_stream должен иметь эти операторы для встроенных типов данных и контейнеров, которые содержат значения встроенных типов данных, в пользовательском классе необходимо определить только операторы "<<" и ">>" для перевода их представления в любой встроенный тип данных или стандартный контейнер. Вот как, например, определяется оператор "<<" для класса spectral_palette в листинге 11.17.

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

>// класса spectral_palette

>pvm_stream &operator<<(pvm_stream &Out, spectral_palette &Obj)

>{

>int N;

>string Source;

>for(N = 0;N < Obj.Colors.size();N++) {

> Source.append(Obj.Colors[N]);

> if( N