Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
5 Мб
Скачать
☆

Пример 7.5.1. Реализация класса cComputer.

///////////////

// C++/CLI Этап 1

#include "stdafx.h"

using namespace System;

ref class CComputer // Класс компьютера

{

String ^producer; // Изготовитель компьютера

int year; // Год изготовления

public:

// Интерфейсная функция ввода данных о компьютере

void Enter()

{

Console::Write("Изготовитель>");

producer= Console::ReadLine();

Console::Write("Год изготовления>");

year= System::Convert::ToInt32(Console::ReadLine());

}

// Интерфейсная функция вывода данных о компьютере

void Show()

{

Console::Write ("Producer= {0}", producer);

Console::WriteLine (" Year= {0}", year.ToString());

}

};

void main() // Главная функция Inf-приложения 1 этапа

{

CComputer ^pComp= gcnew CComputer; // Объект-компьютер в куче

pComp -> Enter(); // Ввести данные

pComp -> Show(); // Вывести данные

Console::ReadKey();

}

Отладка класса сводится к написанию функции main, всесторонне использующей интерфейс объектов класса CComputer. Отладка этого этапа показала, что при ошибочном вводе вместо цифр года иных символов происходит аварийное завершение программы, то есть функция Enter() требует доработки, связанной с проверкой входных символов. Ошибочную ситуацию легко разрешить, применив рекомендованную в языке Java и C# обработку исключений.

Исключениями (exceptions) представляются ошибки, возникающие при функционировании программы, например, при делении на нуль или открытии несуществующего файла. В нашем случае ошибка возникла из-за несоответствия формата данных - функция ToInt32() не смогла преобразовать в число строку, содержащую отличный от цифры символ, и выбросила исключение (throw exception).

Для обработки исключений применяются try-catch блоки. В блок try помещается фрагмент программы, в котором возможен выброс исключения. А непосредственно после этого блока помещается один или несколько блоков catch, каждый из которых реагирует на указанный в нём тип исключения. Если исключение указанного типа было выброшено, то срабатывает соответствующий блок catch, который вместо аварийного завершения программы выполняет действия, указанные программистом. Подробнее об исключениях излагается в разделе 10.10.

Исправим аналогичную ошибку в следующем этапе разработки программы, поместив обработку исключения в функцию Enter() класса CShop.

Этап 2

На втором этапе, располагая только описанием класса CShop, создадим в главной функции main() объект этого класса и протестируем его с функцией Enter(), использующей обработку исключения. В примере 7.5.2 обработка исключения выделена жирным шрифтом.

Пример 7.5.2. Реализация класса cShop.

///////////////

// C++/CLI Этап 2

#include "stdafx.h"

using namespace System;

ref class CShop //Класс магазина

{

String ^place; // Указатель на строку с адресом магазина

int cost; // Стоимость компьютера

public:

// Интерфейсная функция ввода данных о магазине

void Enter()

{

try

{

Console::Write("Адрес магазина>");

place= Console::ReadLine();

Console::Write("Стоимость компьютера>");

cost= System::Convert::ToInt32(Console::ReadLine());

}

catch (Exception ^e)

{

Console::WriteLine (" Ошибка при вводе числа");

return;

}

}

// Интерфейсная функция вывода данных о магазине

void Show()

{

Console::Write ("Адрес={0}", place);

Console::WriteLine (" Стоимость={0}", cost.ToString());

}

};

// Главная функция Inf-приложения 2 этапа

void main ( )

{

CShop ^pComp= gcnew CShop; // Объект-магазин в куче

pComp -> Enter (); // Ввести данные

pComp -> Show (); // Вывести данные

Console::ReadKey();

}

Аналогично первому этапу и здесь при вводе данных надо соблюдать правильность типа данных. В отличие от функции Enter() класса CComputer функция Enter() отлаживаемого класса CShop изменена и содержит обработку исключения Exception. Теперь при некорректном вводе цифр года выбрасывается запланированное нами исключение в блоке try, содержащем функцию ToInt32() преобразования строки в число, и тотчас срабатывает перехватывающий это исключение нижеследующий блок catch. Выполняется функция WriteLine(), размещённая в этом блоке. Эта функция выдаёт на консоль сообщение "Ошибка при вводе числа". Затем оператор return завершает работу нашей функции.

Можно модифицировать функцию, поместив в блок цикл, обеспечивающий повторный ввод года, пока не будет введён год в виде числа. Это может сделать любознательный читатель.

Изменив функцию Enter() класса CComputer аналогично функции Enter() только что отлаженного класса CShop и предполагая, что эти классы тщательно отлажены, переходим к следующему этапу.

Этап 3

Предположив, что функции Enter() и Show() классов CComputer и CShop отлажены, приступаем к разработке класса CData. Программа примера 7.5.3 включает только что отлаженные классы CComputer, CShop и новый класс CData, который надлежит отладить совместно с этими классами. Поскольку

классы CComputer и CShop считаются отлаженными, то причиной ошибок, возникших при отладке программы, следует считать только вновь введённый класс CData. Таким образом ссужается размер программы, подлежашей отладке.