29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
|
||||||
1 | ||||||
Шаблоны классов08.11.2010, 17:46. Показов 14478. Ответов 18
Метки нет (Все метки)
Условия:
1. Создать шаблон класса для работы с массивом произвольного типа данных. Шаблон должен включать: • указатель, хранящий адрес размещения массива в динамической памяти; • целочисленную переменную, показывающую количество занятых элементов массива; • конструктор без параметров с параметрами по умолчанию; • конструктор копирования; • метод «обработка массива» (на начальном этапе метод выводит на консоль какое-либо сообщение); • деструктор и другие необходимые для работы методы (например, перегрузка операций индексирования и присваивания, методы ввода / вывода и т.д.). 2. Предусмотреть генерацию и обработку исключений для возможных ошибочных ситуаций (отрицательная размерность при задании массива, выход за границы диапазона при обращении по индексу и т.д.). 3. В функции main() показать использование созданного класса, включая ситуации, приводящие к генерации исключений; показать инстанцирование шаблона для различных типов. 4. На основе данного шаблона создать Задание: Дана строка латинских символов. Преобразовать строку, разместив символы в алфавитном порядке, разделяя их пробелами. Вот не совсем понимаю, как написать конструктор для массива, да еще и конструктор копирования Может кто помочь? Извените не там созадл тему, переместите для начинающих)) Добавлено через 2 часа 22 минуты Вот что то попробовал, но с перегрузкой индексирования не понимаю как сделать. И еще ошибку выдает: error C2955: List: для использования класса шаблон требуется список аргументов шаблон error C2244: List<T>::operator []: не удается сопоставить определение функции существующему объявлению
0
|
08.11.2010, 17:46 | |
Ответы с готовыми решениями:
18
Шаблоны классов в С++ Шаблоны классов шаблоны классов VS 2013 - шаблоны классов -> обязательно ли функции шаблона класса делать встроенными? |
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
08.11.2010, 20:08 | 2 |
В принципе, довольно неплохо. Видимые ошибки:
1. Почему класс назван List - список? Массив - это скорее Array.... Имя класса дезориентирует. Нужно исправить. 2. Нет требуемого по заданию конструктора без параметров (или с параметрами по умолчанию). 3. Конструктор List(T* str) реализован с ошибкой - память нужно выделять также и для завершающего строку символа '\0'. И, конечно же, копировать и его. А что мешает использовать стандартную функцию strcpy? 4. Конструктор копирования реализован с тремя ошибками: 1. нет проверки на присваивание самому себе, 2. та же самая ошибка с завершающим нуль символом, 3. копирование производит вмешательство в данные _копируемого_ объекта. Правильная сигнатура была бы List(const List<T>& tam). Для операции индексирования полезно реализовать две сигнатуры - T& operator [] (int) для записи, и T operator [] (int) const для чтения. В общем, начал ты неплохо. Правь код, выкладывай исправленный вариант, и будем посмотреть дальше....
1
|
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
|
||||||
08.11.2010, 20:47 [ТС] | 3 | |||||
Вот что получилось:
На счет индексирования вообще не понимаю как делать(((
0
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
08.11.2010, 21:01 | 4 |
Почему же не понимаешь? Сделал его ты (или все же не ты??) правильно...
Вот теперь уже код значительно лучше! Внимательнее посмотрю завтра уже, наверняка нарою еще багов :-)
0
|
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
|
||||||
08.11.2010, 21:09 [ТС] | 5 | |||||
Не, ну написал его я, и это разве я правильно написал?
Т.е. можно можно написать:
error C2440: =: невозможно преобразовать "const char [2]" в "char" Добавлено через 3 минуты да этого еще другая была
0
|
232 / 102 / 5
Регистрация: 18.04.2010
Сообщений: 294
|
||||||
08.11.2010, 22:28 | 6 | |||||
0
|
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
|
||||||
09.11.2010, 15:22 [ТС] | 7 | |||||
да да, это я тупанул, уже нашел )))
Добавлено через 12 минут Вот переделал программу, уже так сказать более абстрактно, для разных типов:
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||||||||||||||||||||||
10.11.2010, 04:00 | 8 | |||||||||||||||||||||||||
robert19, Советую все же еще
И когда с индексацией работаете лучше мне кажется size_t использовать, ибо индекс никаким раком не может быть отрицательным. И впринципе я бы сделал вместо Show_list - перегрузку оператора вывода в поток. Причем вне класса.
Для чего соответственно не помешал бы метод Size() или что-нибудь вроде. А переменную size неплохо бы сделать size_t.
А так впринципе все довольно неплохо. Добавлено через 2 минуты На кой тут int аще не понятно. void будет лучше.
1
|
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
|
||||||
10.11.2010, 07:34 [ТС] | 9 | |||||
Ну вот я решил пока вот так написать:
И вот вы мне выше писали про перегрузку через потоки. Я просто еще не учил((
0
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
||||||
10.11.2010, 10:26 | 10 | |||||
Стоп! вот здесь ты накосячил. Если будет возвращена ссылка на константный элемент массива (const T&), то ты не сможешь изменять этот элемент - это ведь не то, чего ты хотел бы добиться, не так ли?
Правильно сделать две версии оператора [] - константную и неконстантную. Константная для чтения, неконстантная для записи - а компилятор уж сам разберется, когда какую вызвать. Сигнатуры такие:
0
|
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
|
|
10.11.2010, 11:06 [ТС] | 11 |
А зачем 2 версии, что то понять не могу. Ну записал я туда какое нить значение и все же.
и вот еще интересно, когда создаю объект флоат и ввожу туда значения пример: 1,2 2,5. Он их показывает как целые 1 и 2. как это исправить?
0
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
10.11.2010, 11:24 | 12 |
1. Ну если лень писать, то можешь оставить одну - неконстантную. Но грамотно все-таки две. Я уже объяснил, почему.
2. вводить надо 1.2 и 2.5
0
|
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
|
|
10.11.2010, 11:44 [ТС] | 13 |
Да мне не лень. просто на лекциях когда показывали, приводили только 1 пример.
0
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
10.11.2010, 12:05 | 14 |
Мдя. Если преп о константности не в курсах, то что уж тут говорить :-( .....
0
|
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
|
|
10.11.2010, 15:25 [ТС] | 15 |
0
|
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
|
||||||
12.11.2010, 23:56 [ТС] | 16 | |||||
Ну вот вроде все выполнил:
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
13.11.2010, 02:17 | 17 | |||||
Проверку на отрицательный размер в конструкторе копирования совершенно не всек. Как это может быть, если проверка есть в констре по умолчанию?
Ведь априори у объекта этого класса не может быть отрицательного размера...
1
|
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
|
|
13.11.2010, 09:03 [ТС] | 18 |
Ага, спс. Эт я так. Просто проверял)))
Добавлено через 20 секунд По заданию я вроде все выполнил
0
|
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
|
||||||
15.11.2010, 17:47 [ТС] | 19 | |||||
Почему он ругается, когда я пытаюсь сделать так:
0
|
15.11.2010, 17:47 | |
15.11.2010, 17:47 | |
Помогаю со студенческими работами здесь
19
Шаблоны классов (умножение классов) Шаблоны классов Шаблоны классов Шаблоны классов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |