Управляемые расширения для 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с), то не должны делать особое заявление по этому поводу.
Содержание раздела