Иллюстрированный самоучитель по Visual Studio.Net

   лдсп резка | мебельный щит дуб сращенный столярная плита класс АВ. |       

Управляемые расширения для C++


Так называется множество расширений языка C++. Они были введены с целью помочь разрабатывать приложения, ориентированные на платформу Microsoft.Net. Традиционный (unmanaged) код C++ и управляемый код (managed) могут одновременно присутствовать в одном приложении, не мешая друг другу. Для того чтобы получить быстрое представление об этой технологии, рассмотрим пример. Вы начинаете со стартовой заготовки Visual C++ Projects, скроенной по шаблону Managed C++ Application, задав имя проекту (например, Man), и получаете два СРР-

файла: Мап.срр и Assemblylnfo.cpp. Первый файл представляет собой заготовку вашей программы консольного типа:

//=== Импортирует метаданные в программу, использующую

//=== Managed Extensions for C++

#using <mscorlib.dll>

// Стало доступным пространство имен System, которое

// содержит описания фундаментальных классов, атрибутов,

// интерфейсов и событий

using namespace System;

int main (void)

{

// Console — это класс, который обеспечивает стандартные

// операции ввода-вывода в окно консольного типа

Console::WriteLine("Hello World");

return 0;



}

Второй файл содержит атрибуты настройки сборочной информации (assembly metadata). Коды этого файла нет смысла рассматривать, так как они носят сугубо служебный характер. Вы можете запустить программу на выполнение (Ctrl+F5) и увидеть традиционное приветствие в окне консольного типа. Теперь покажем, как можно создать управляемый динамический массив. Вставьте директиву finclude <stdlib.h> и отредактируйте код главной функции:

void main()

{

// Описатель _gс декларирует garbage-collected object,

// то есть объект, за памятью которого будет следить CLR

int managed _gc[] = new int _gc[rand()%100 + 1);

//==== Обычный динамический массив

int *unmanaged = new int[rand()%100 + 1];

//==== Мы можем задавать вопросы объекту managed

Console::WriteLine (managed->Count);

Console::WriteLine (managed->Rank);

//==== Мы не можем задавать вопросы объекту unmanaged


}

Запустите проект и убедитесь в том, что в окне выведены два числа, 42 и 1. Первое число является случайно выбранным размером массива (managed), а второе — рангом массива, то есть его размерностью (одномерный массив). Для того чтобы чуть-чуть глубже проникнуть в тайны управляемого кода и данных, дополните тестовую программу кодами нового управляемого класса Man. Вставьте следующие коды до функции main.

Что-то от Java или Visual Basic? Нет, это — managed C++!

public _gc

class Man // Эта строка ничем не отличается от C++

{

private:

//=== String — новый мощный класс для работы с текстом

String *m_Name;

// Имя

int m_Age;

// Возраст

public:

//==== Конструкторы

Man ()

{

m_Name = S "Dummy";

m_Age = 0;

}

Man (String* n, int a)

{

m_Name = n;

m Age = a;

}

//==== Два метода доступа к закрытым данным

String* GetName()

{

return m_Name;

}

int GetAge ()

{

return m_Age;

}

};

Теперь опробуйте работу нового управляемого типа данных — объектов класса Man, в условиях управляемого кода.

void main ()

{

//=== Создаем двухмерный массив указателей

//=== на объекты класса Man

Man * men[,] = new Man *[2, 2];

//=== Как вам нравится новый (управляемый) синтаксис?

//=== Инициализируем один элемент массива

men [1,1] = new ManC'Alex Black ",54);

//===Мы можем задавать вопросы объекту men

Console: :WriteLine (men->Count) ;

Console: :WriteLine (men->Rank) ;

Console: :WriteLine (men[l, 1] ->GetName ( ) ) ;

Console: :WriteLine (men [1, 1] ->GetAge () ) ;

}

Программа выведет следующий текст:

4

2

Alex Black

54

Пока мы видим только новый синтаксис и возможность задавать вопросы динамическому массиву. Но теперь попробуйте вставить код с ошибками алгоритмического плана и запустите на выполнение.

for (int i=0; i<5; i++)

Console::WriteLine(men[i,i]->GetName());

Если вы на предложение отладить код ответите отказом, то в окне будет выведен такой текст:

Exception occurred: System.NullReferenceException:

Attempted to dereference a null object reference.

at Man.GetName() in с:\man\man.cpp:line 27

at main() in с:\man\man.cpp:line 61

Такое поведение программы в ситуации с типичной ошибкой разработчика, безусловно, следует признать более надежным. Оно даст возможность значительно сэкономить наше время в будущем. Отметьте, что если вы не хотите пользоваться услугами автоматического сборщика мусора (_gс), то не должны делать особое заявление по этому поводу.




Содержание раздела