| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Центр помощи > [C++] Динамичсекий массив |
| Автор: Mcicool 27.5.2007, 15:57 |
| Помогите решить вот такую задачу пожалуйста, в динамичсеких массивах не разбираюсь, а сдавать надо (( Сейчас мохг другим занят. Спасибо за помощь. Создайтё класс с именем CArray, содержащий два поля, одно для хранения указателя на динамический массив, другое для хранения длины массива. По смыслу класс CArray должен инкапсулировать динамический массив. Для класса создайте конструкторы: 1) умолчания, 2) копирования, 3) с одним параметром - длиной массива, создающий динамический массив заданной длины и инициализирующий его нулями. Для предотвращения неявного приведения типов использовать специальное ключевое слово. Перегрузить оператор вывода массива на экран. Перегрузить оператор квадратные скобки []. Этот оператор должен по заданному номеру n проверять не выходит ли этот номер за границы массива, в том случае, если нет - возвращать ссылку на n-ный элемент массива, если же индекс выходит за границы - возвращать ноль. Реализовать также оператор присваивания. Предусмотреть в классе деструктор! |
| Автор: Xenon 27.5.2007, 16:28 | ||
Mcicool,
А если у нас массив int и в нем элемент равен 0? |
| Автор: Mcicool 27.5.2007, 16:37 |
| Я плохо понимаю, но разве для нас важно, какое значение элеменета? Нас же индекс интересует... |
| Автор: mr.Anderson 27.5.2007, 16:47 |
| Mcicool, имеется в виду, что возврат нуля в случае ошибки - это неверно. Так как нулем может оказаться и один из элементов. Тогда проверка функции на 0 (т.е. на ошибку) будет ошибочной по своей сути. А вообще, работа довольно объемная. Это не курсовая случаем? |
| Автор: Mcicool 27.5.2007, 16:56 |
| нее, это одна из 9-ти задач, которых нам на 3 недели задали... Вот поэтому и прошу помочь с этой, так как многие другие я более менее сделал. Добавлено через 1 минуту и 45 секунд А что тут можно предложить тогда ? |
| Автор: Xenon 27.5.2007, 17:00 | ||
Добавлено через 3 минуты и 13 секунд Mcicool, реализовать стандартное поведение, как в том же методе at() контейнера std::vector<TYPE> - выбрасывать исключение std::out_of_range, что я, собственно, и сделал. А то выбрасывать 0 дебелизм по всем параметрам и это невозможно реализовать, так как у нас возвращается элемент по ссылке, а 0 в данном случае будет временной локальной переменной, которая не может быть возвращена по ссылке - 0 возможно вернуть из operator[] - для возврата не lvalue нужно использовать констатную ссылку, но тогда любая переменная, получаенная при помощи arr[i] не может быть изменена - а это идиотизм, сам понимаешь |
| Автор: Mcicool 27.5.2007, 18:20 |
| А без STL обойтись никак нельзя ?? |
| Автор: Xenon 27.5.2007, 18:41 | ||
Mcicool, Под STL ты подрузомеваешь std::out_of_range? Ну напиши просто:
Хотя это не совсем хорошо. Лучше уже тогда свой класс-исключение напиши. |
| Автор: Mcicool 27.5.2007, 18:57 |
| Я просто не совсем понимаю такие вещи как : template <class TYPE> И как дальше этот TYPE используется... Что это вообще ? |
| Автор: mr.Anderson 27.5.2007, 19:24 |
| Mcicool, подразумевает любой тип данных. |
| Автор: Xenon 27.5.2007, 19:26 | ||
| Mcicool, ну тут извини, ты должен такое знать template - шаблон. Грубо говоря продвинутый макрос. Вместо TYPE подставляет тип данных, которые будет хранить твой массив - любой интегральный тип : int, double, float и т.д. или свой какой-нибудь. Этот тип ты указываешь при создании массива:
Вот int и есть аргумент шаблона. То есть на момент компиляции компилятор создаст класс CArray, где он вместо TYPE везде напишет int. Это делают, чтобы не надо было для каждого разного типа писать разные классы (а то представь сколько работы надо, чтобы написать тоже самое для int, для float, для каких-то других типов), если твой твой класс-контейнер не является интрузивным. Вобще, почитай литературу на тему "Шаблоны" или в интернете глянь. |
| Автор: Mcicool 28.5.2007, 19:19 |
| Огромное спасибо Xenon. |