Студопедия

КАТЕГОРИИ:


Архитектура-(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; Просмотров: 223; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.019 сек.