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