|
Программирование >> Инициализация объектов класса, структура
#include Array.h template <class elemType> void try array( Array<elemType> ) cout << try array: начальные значения массива\n ; cout << iA << endl; elemType find val = [ i.size()-1 ]; i.size()-1 ] = i.min(); int mid = iA.size()/2; i[0] = i.maxO; i[mid] = iA[0] ; cout << try array: после присваиваний\n ; cout << iA << endl; Array<elemType> = iA; i[mid/2] = i2[mid]; cout << try array: почленная инициазация\n ; cout << iA << endl; = i2; cout << try array: после почленного копирования\n ; cout << iA << endl; iA.grow(); cout << try array: после вызова grow\n ; cout << iA << endl; int index = i.find( find val ); cout << искомое значение: << find val; cout << \tвозвращенн индекс: << index << endl; elemType value = i[index]; cout << значение элемента с этим индексом: ; cout << value << endl; Рассмотрим шаблон функции try array(). На первом шаге печатается исходный объект Array, что подтверждает успешную конкретизацию оператора вывода шаблона, а заодно дает начальную картину, с которой можно будет сверяться при последующих модификациях. В переменной find val хранится значение, которое мы впоследствии передадим find() . Если бы try array() была обычной функцией, роль такого значения сыграла бы константа. Но поскольку никакая константа не может обслужить все типы, которыми допустимо конкретизировать шаблон, то приходится выбирать другой путь. Далее одним элементам Array случайным образом присваиваются значения других элементов, чтобы протестировать min() , max() , size() и, конечно, оператор взятия индекса. Затем объект iA2 почленно инициализируется объектом iA, что приводит к вызову копирующего конструктора. После этого тестируется оператор взятия индекса с объектом ia2: производится присваивание элементу с индексом miid/2. (Эти две строки представляют интерес в случае, когда iA - производный подтип Array, а оператор взятия индекса объявлен виртуальной функцией. М1 вернемся к этому в главе 18 при обсуждении наследования.) Далее в iA почленно копируется модифицированный объект iA2, что приводит к вызову копирующего оператора присваивания класса Array. Затем проверяются функции-члены grow() и find() . Напомним, что find() возвращает значение -1, если искомый элемент не найден. Попытка выбрать из массива Array #include Array.C #include try array.C #include <string> int main() static int ia[] = { 12, 7, 14, 9, 128, 17, 6,3,27, 5 }; static double da[] = { 12.3,7.9,14.6,9.8,128.0 }; static string sa[] = { Eeyore , Pooh , Tigger , Piglet , Owl , Gopher , Heffalump Array<int> iA( ia, sizeof(ia)/sizeof(int) ); Array<double> dA( da, sizeof(da)/sizeof(double) ); Array<string> sA( sa, sizeof(sa)/sizeof(string) ); cout << template Array<int> class\n << endl; try array(iA); cout << template Array<double> class\n << endl; try array(dA); cout << template Array<string> class\n << endl; try array(sA); return 0; которая вызывает try array() с каждым из указанных типов: Вот что программа выводит при конкретизации шаблона Array типом double: try array: начальные значения массива ( 5 )< 12.3, 7.9, 14.6, 9.8, 128 > try array: после присваиваний ( 5 )< 14.6, 7.9, 14.6, 9.8, 7.9 > try array: почленная инициализация ( 5)< 14.6, 7.9, 14.6, 9.8, 7.9 > try array: после почленного копирования ( 5)< 14.6, 14.6, 14.6, 9.8, 7.9 > try array: после вызова grow ( 8 )< 14.6, 14.6, 14.6, 9.8, 7.9, 0, 0, 0 > искомое значение: 128 возвращенный индекс: -1 значение элемента с этим индексом: 3.35 965e-322 Выход индекса за границу массива приводит к тому, что последнее напечатанное программой значение неверно. Конкретизация шаблона Array типом string заканчивается крахом программы: элемент с индексом -1 приведет к выходу за левую границу. (В главе 18 для перехвата этой ошибки мы построим производный от Array класс, который будет проверять выход за границы массива.) Убедиться, что наша реализация шаблона работает для различных типов данных, например целых чисел, чисел с плавающей точкой и строк, поможет программа main() , template Array<string> class try array: начальные значения массива ( 7 )< Eeyore, Pooh, Tigger, Piglet, Owl, Gopher, Heffalump > try array: после присваиваний ( 7 )< Tigger, Pooh, Tigger, Tigger, Owl, Gopher, Eeyore > try array: почленная инициализация ( 7 )< Tigger, Pooh, Tigger, Tigger, Owl, Gopher, Eeyore > try array: после почленного копирования ( 7 )< Tigger, Tigger, Tigger, Tigger, Owl, Gopher, Eeyore > try array: после вызова grow ( 11 )< Tigger, Tigger, Tigger, Tigger, Owl, Gopher, Eeyore, <пусто>, <пусто>, <пусто>, <пусто> > искомое значение: Heffalump возвращенный индекс: -1 Memory fault (coredump) Упражнение 16.11 Измените шаблон класса Array, убрав из него функции-члены sort(), find(), miax(), min() и swap() , и модифицируйте шаблон try array() так, чтобы она вместо них пользовалась обобщенными алгоритмами (см. главу 12).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |