Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2013, 23:09   #1
Studentochka123
Новичок
Джуниор
 
Регистрация: 25.11.2013
Сообщений: 2
По умолчанию Разработка класса вектор

Помогите пожалуйста с заданием

цель:
Разработать класс вектор для хранения целых чисел с проверкой правильности обращения по индексу и встроенными операциями сложения и вычитания векторов, умножения на скаляр, скалярного произведения.
Задание:
Определить класс для хранения целых чисел с проверкой правильности обращения по индексу и встроенными операциями сложения и вычитания векторов, умножения на скалаяр, скалярного произведения. Написать функцию MAIN() и проиллюстрировать в ней все определенные операции с объектами класса.
Studentochka123 вне форума Ответить с цитированием
Старый 25.11.2013, 23:12   #2
Studentochka123
Новичок
Джуниор
 
Регистрация: 25.11.2013
Сообщений: 2
По умолчанию

Пример конструирования класса
Для хранения данных потребуется некоторая область памяти, начало которой мы определим как указатель на целое (int* ia, а размер ее будем хранить в целом числе (int size. Тогда определение класса может выглядеть следующим образом:
const int IntArraySize = 24;
class IntArray{
public:
IntArray(int sz = IntArraySize);
IntArray(const IntArray&);
~IntArray(){ delete [] ia;};
IntArray& operator=(const IntArray&);
int& operator[](int);
int getSize() const { return size;};
protected:
int size;
int* ia;
};
Определенная в строке “const int IntArraySize = 24;” константа используется при конструировании объекта типа IntArraySize с размером по умолчанию: IntArraySize ia; //здесь объект ia будет создан с size = 24
IntArraySize ia1(40); //здесь объект ia1 будет создан с size = 40 .
Конструктор класса может иметь cледующий вид:
IntArray ::IntArray(int sz) {
size = sz;
ia = new int[size];
}
Конструктор копирования класса X::X(const X&) предназначен для конструирования объекта следующим образом:
IntArraySize ia2 = ia1;
Объект ia2 будет создан в виде точной копии объекта ia1, при отсутствии же конструктора копирования будет выполнена почленная инициализация ia2 данными ia1, то есть ia2.size = ia1.size; ia2.ia =ia1.ia; последнее представляет потенциальную опасность. Время существования объектов ai1 и ia2 может быть разным, если ia1 прекращает существование деструктор освобождает память на которую продолжает указывать указатель ia2.ia, поскольку он был инициализирован указателем ia1.ia при почленном копировании.
Таким образом конструктор копирования должен создать новый объект являющийся точной копией объекта которым осуществляется инициализация:
IntArray ::IntArray(const IntArray& IA) {
size = IA.size;
ia = new int[size];
for(int i = 0; i < size; I++)
{
ia[i] = IA.ia[i];
}
}
Поскольку размер копируемого объекта не обязан совпадать с прежним размером, необходимо освободить память, выделить ее заново для копируемого объекта и перенести данные.
Перегрузка операции “равно” будет использована в случае:
ia = ia1;
Для того чтобы реализовать такую возможность необходимо определить перегрузку операции “равно”:
IntArray& IntArray:perator =(const IntArray& iA){
delete [] ia;
size = iA.size;
ia = new int[size];
for(int i = 0; i < size; i++)
{
ia[i] = iA.ia[i];
}
return *this;
}
Определение операции []может выглядеть следующим образом:
int& IntArray:perator[](int index){
return ia[index];
}
В производном от IntArray классе, вероятно потребуется переопределение этой операции таким образом чтобы исключить обращение по неверному индексу.
Для создания нового объекта типа IntArray с одновременной инициализацией с помощью предопределенного массива целых, например таким образом:
int arr[] = {1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1, 0};
IntArray arr1(arr,19);
потребуется определение еще одного конструктора IntArray(int*,int);.
IntArray::IntArray( int *arr, int sz) {
size = sz;
ia = new int[size];
for(int i = 0; i < size; i++) {
ia[i] = arr[i];
}
}
Используя построенный класс создадим производный от него класс снабдив его дополнительными свойствами.
class IntArrayRC : public IntArray {
public:
IntArrayRC(int = ArraySize);
int& operator [](int);
protected:
void RangeCheck(int);
};
Переопределим операцию [] для обеспечения проверки выхода индекса за границы массива. Реализация операции может выглядеть следующим образом:
int& IntArrayRC :: operator[](int index){
RangeCheck(index);
return ia[index];
}
Функция член класса RangeCheck(int), для проверки правильности доступа по индексу, может быть реализована следующим образом:
#include <stdlib.h>
void IntArrayRC::RangeCheck(int index) {
if(index <= 0 || index >=size){
cerr <<"Неверный индекс!\n";
exit(1);
}
}
Studentochka123 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вектор указателей на экземпляры класса Aldegid Общие вопросы C/C++ 9 06.05.2012 01:15
вектор, состоящий из обьектов класса sinestro Visual C++ 3 20.04.2012 15:07
вектор объектов класса и алгоритмы РагнаР Общие вопросы C/C++ 3 10.04.2011 07:00
Вектор из callback'ов методов класса Gongled Общие вопросы C/C++ 7 05.01.2011 16:29
Разработка собственного класса 1ntro Общие вопросы C/C++ 3 16.12.2007 14:54