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