Учебник по Visual C++ .Net


Управляемые расширения для C++ - часть 2


}

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




Начало  Назад  Вперед