Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_Lab_16_17.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
14.46 Mб
Скачать

7.2.Методическая помощь

Очевидно, что в программе вам понадобится описать массив объектов класса и работать с ним. Допустим, вы сделали такие описания:

class CMyTrouble: public CMyLove

{

char *LoverName;

public:

CMyTrouble():CMyLove()

{/**/}

CMyTrouble(char * iName, int iSome):CMyLove(iSome)

{/**/}

// ...

};

// ...

const int Max=20;

CMyTrouble List[20]; /*Так можно описать массив объектов только в том случае, если в классе определен конструктор без параметров */

// ...

Теперь, когда вы будете помещать объект в массив List с помощью внешне безобидного оператора

List[i]=CMyTrouble(SomeName, iNum);

то столкнетесь с определенными неприятностями, если, как в данном примере, среди член-данных есть указатели. Эти неприятности вызваны тем, что при выполнении указанного оператора будут вызываться деструктор, конструктор копирования и собственно операция присваивания. Вследствие того, что реализации деструктора, конструктора копирования и операции присваивания «по умолчанию» в данном случае неприменимы, вам придется их реализовывать самостоятельно, что само по себе, конечно, полезно, но «морочливо». Конечно, если вы их разработаете, то можете просить у преподавателя дополнительные баллы за свой «сугубо индивидуальный» труд.

Другим выходом является использование массива указателей на объекты:

const int Max=20;

CMyTrouble *List[20];

// ...

Теперь можно помещать объект в массив List с помощью оператора

List[i]=new CMyTrouble(SomeName, iNum);

В таком случае вам можно обойтись без перегрузки операции присваивания и конструктора копирования, хотя деструктор придется разработать, ничего не поделаешь. Кроме того, надо не забыть выполнить освобождение памяти от объектов в массиве List.

Еще одно замечание, касающееся использования символов кириллицы. Если файл с исходными данными ваших объектов вы создавали с помощью редактора среды MVS или блокнота, то символы кириллицы записаны в кодировке Windows. У вас не будет проблем с символами кириллицы, если вы в своей программулине вызовите хвункцию

setlocale(LC_ALL, "Rus");

Но, когда вы в программе будете вводить символы кириллицы с помощью потока cin, то вы их получите в кодировке DOS, а не Windows. Тогда при записи таких символов в файл надо использовать, например, такую функцию

char Buff[1024];

char * Rus(char *Str)

{

OemToCharA(Str,Buff);

return Buff;

}

В качестве иллюстрации этого обстоятельства обратите внимание на следующий непростой случай записи данных в файл:

char FName[20], SName[20];

cout<<"Введи имя>";

cin>>FName;

cout<<"Введи фамилию>";

cin>>SName;

// запись данных в файл (out - объект ostream)

out<<Rus(FName)<<' '<<Rus(SName)<<' '<< /* и так далее*/;

Когда вы посмотрите на содержимое файла, то обнаружите там, что имя и фамилия совпадают! Этот глюк исправить можно таким простым способом:

out<<Rus(FName)<<' '; out<<Rus(SName)<<' '<< /* и так далее*/;

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

Кстати, еще один вопросец. Приведенная выше реализация функции Rus предполагает, что длина преобразуемой строки символов не превышает магического числа 1023. А если она будет больше, что делать? В принципе длина строки символов с завершающим нулем (тип char*) может иметь размер до 2ГБ. Найдете выход?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]