Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shpora_ROD_1.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1 Мб
Скачать
☆

Билет №4

1. Ускорение решения задачи в распределенной параллельной системе

2. Язык idl

Язык IDL (Interface Definition Language) предназначен для определения интерфейсов и поддержки удаленного вызова процедур и маршалинга параметров процедуры.

Синтаксис языка IDL (Interface Definition Language) похож на С и С++. Язык обладает богатыми возможностями описания интерфейсов и данных, используемых клиентом и компонентом.

Давайте рассмотрим пример описания интерфейса на IDL.

import “unknwn.idl”;

// Интерфейс IX

[

object,

uuid(32bb8323-b41b-11cf-a6bb-0080c7b2d682),

helpstring(“IX Interface”),

pointer_default(unique)

]

interface IX : IUnknown {

HRESULT FxStringIn([in, string] char* szIn);

HRESULT FxStringOut([out, string] char** szOut);

};

На С++ соответствующие функции выглядели бы так:

virtual HRESULT __stdcall FxStringIn(char* szIn);

virtual HRESULT __stdcall FxStringOut(char** szOut);

Синтаксис MIDL не очень отличается от синтаксиса С++. Самое очевидное отличие — информация в квадратных скобках []. Перед каждым интерфейсом идет список атрибутов, или заголовок интерфейса. В данном примере заголовок состоит из четырех записей. Ключевое слово object задает, что данный интерфейс является интерфейсом СОМ. Это ключевое слово представляет собой расширение IDL от Microsoft. Второе ключевое слово — uuid — задает IID интерфейса. Третье ключевое слово используется для помещения строки подсказки в библиотеку типа. Библиотеки типа связаны с серверами вне процесса. Четвертое ключевое слово — pointer_default — говорит компилятору MIDL, как работать с указателями, атрибуты которых не заданы явно:

ref — указатели рассматриваются как ссылки. Они всегда будут содержать допустимый адрес памяти и всегда могут быть разыменованы. Они не могут иметь значение NULL. Они указывают на одно и то же место в памяти как до, так и после вызова. Кроме того, внутри функции для них нельзя создавать синонимы (aliases).

unique — эти указатели могут иметь значение NULL. Кроме того, их значение может изменяться при работе функции. Однако внутри функции для них нельзя создавать синонимы.

ptr — эта опция указывает, что по умолчанию указатель эквивалентен указателю С. Указатель может иметь синоним, может иметь значение NULL и может изменяться.

Входные и выходные параметры в IDL. Если параметр помечен как входной in, то MIDL знает, что этот параметр нужно передавать только от клиента компоненту. Ключевое слово out говорит о том, что параметр используется только для возврата данных от компонента клиенту.

HRESULT. IDL требует, чтобы функции интерфейсов, помеченные как object, возвращали HRESULT. Основная причина этого — требование поддержки удаленных серверов.

Ключевое слово import в IDL. Ключевое слово import используется для включения определений из других файлов IDL. unknwn.idl содержит описание на IDL интерфейса IUnknown; import является аналогом команды препроцессора С++ #include, но с помощью import файл можно импортировать сколько угодно раз, не создавая проблем с повторными определениями.

Задача - Дать пример полиморфизма на языке С++

Полиморфизм. В языке С++ полиморфизм трактуется как объявление функции в базовом классе и ее специфическое определение в каждом классе иерархии, наследующей базовый класс. На базе полиморфизма строится еще одна плоскость, отделяющая интерфейс объекта от его реализации. Он поддерживает создание программ, расширяемых не только в период их создания, но также в период использования. Полиморфный тип, определяемый через иерархию классов объектов, – это тип, описываемый посредством виртуальных функций.

Пример полиморфизма в С++. Он строится на иерархии классов духовых инструментов:

// Инструмент

class Instrument { public: virtual void play () { cout << “Instrument :: play” << endl; }};

// Духовые

class Wind : public Instrument { public: void play () { cout << “Wind :: play” << endl; }};

// Мелодия

void tune ( Instrument& i ) { i.play (); }

// Исполнение

void main () {

Wind flute; // Флейта

tune (flute); // Upcasting

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]