КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Средства манипулирования данными
Целостность данных Для поддержания целостности объектно-ориентированный подход предлагает использовать следующие средства:
К сожалению, в объектно-ориентированном программировании отсутствуют общие средства манипулирования данными, такие как реляционная алгебра или реляционное счисление. Работа с данными ведется с помощью одного из объектно-ориентированных языков программирования общего назначения, обычно это SmallTalk, C++ или Java.
3. Работа с классами в С++
Чтобы определить в С++ новый класс данных, имеющий свои поля данных и методы, используется следующий синтаксис: class СDate { int Month, Day, Year; public: void SetValue(int m, int d, int y); bool LeapYear(); }; Методы класса должны быть реализованы в коде: чтобы подчеркнуть, что они являются частью класса Tdate. В языке С++ принимается соглашение об использование трефикса С перед именем каждого определяемого класса. Это лишь соглашение, поскольку компилятор воспринимает символ С точно так же, как и все остальные буквы, но оно настолько распространено, что следование ему сделает ваш код значительно понятнее. Другое соглашение заключается в том, чтобы использовать двух- или трехбуквенный префикс для указания разработчика класса (фирмы или конкретного человека). Это соглашение является общепринятым для компонентов. (Например: cl_Date) Для илюстрации использования объектов в программах, приведен класс простейшего связного списка. Этот список является двусвязным, и содержит объекты типа Node. Обратите внимание, что список имеет один фиктивный элемент. Первый элемент списка не содержит информации и является вспомагательным. Класс имеет два конструктора, для создания пустого списка или клона к уже имеющемуся и заполненному списку, а так же свой оператор присваивания. typedef class Node* link; class Node{ public: // класс элемента списка char* str; link next; link prev;
Node(){ str = NULL; next = NULL; prev = NULL; } ~Node(){ if(str) delete str; str = NULL; if(next) delete next; next = NULL; prev = NULL; } };
class List { // класс списка public: link head; // указатель на начало списка link last; // указатель на конец списка
public: List(){ head = NULL; last = NULL; CreatList(); } List(List& lt) { if(lt.head) { head = new Node; CopyList(head, lt.head); } } ~List() { if(head) DeleteList(head); last = head; } void Set() // функция очистит список { if(head) DeleteList(head); last = head; } void Set(const List& lt) { if(head) DeleteList(head); if(lt.head) { head = new Node; CopyList(head, lt.head); } } const List& operator = (const List& lt) { if(head) DeleteList(head); if(lt.head!=NULL) { head = new Node; CopyList(head, lt.head); } return *this; } private: // служебные функции класса // функция копирования списка void CopyList(link dest, link source) { if (source) { if(source->str) { dest->str = new char [ strlen(source->str)+1 ]; strcpy(dest->str, source->str); } if(source->next) { dest->next = new Node; dest->next->prev = dest; CopyList(dest->next, source->next); } else { dest->next = NULL; last = dest; } } } // функция удаления списка void DeleteList(link node) { if(node) { delete node; } node=NULL; } // функция создания нового списка void CreatList() { if (head == NULL) { head = new Node; head->next = NULL; head->prev = NULL; last = head; } }
public: // функция добавления элемента в конец void AddNodeToEnd(const Node& nd) { link curr = new Node; curr->str = new char [ strlen(nd.str)+1 ]; strcpy(curr->str, nd.str); curr->next = NULL; curr->prev = last; last->next = curr; last = curr; } // функция добавления элемента в начало void AddNodeToBegin(const Node& nd) { link curr = new Node; curr->str = new char [ strlen(nd.str)+1 ]; strcpy(curr->str, nd.str); curr->next = head->next; curr->prev = head; head->next = curr; }
// функция печати списка по порядку void PrintListForward() { if (head!= NULL && head->next!= NULL) { link curr = head->next; int k = 1; printf("\n\nText:\n"); while(curr) { printf("Line %2d -> %s\n", k++, curr->str); curr = curr->next; } } } // функция печати списка в обратном порядке void PrintListBack() { if (head!= NULL && last!= NULL) { link curr = last; int k = 1; printf("\n\nText:\n"); while(curr->prev) { printf("Line %2d -> %s\n", k++, curr->str); curr = curr->prev; } } } }; // демонстрация использования класса int main() { Node a; // создание элемента a.str = new char[100]; strcpy(a.str, "String 1");
List list1; // создание списка List1.AddNodeToEnd(a); // добавление в конец strcpy(a.str, "String 2"); list1.AddNodeToEnd(a); strcpy(a.str, "String 3"); list1.AddNodeToEnd(a); strcpy(a.str, "String 4"); list1.AddNodeToBegin(a); // добавление в начало
list1.PrintListForward(); List list2(list1); // создание другого списка копированием list2.PrintListBack(); printf("\n"); return 0; }; Обратите внимание, что при копировании списка происходит выделение памяти и копирование непосредственно каждого элемента. Ни в коем случае нельзя просто присвоить указателю на начало списка значение указателя на начало другого списка, т.к. при изменение данных в одном списке, произойдет изменение данных другого списка, а при удалении списка, элементы будут удаляться дважды, что приведет к ошибкам.
Дата добавления: 2014-01-07; Просмотров: 244; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |