ООП Классы. Данные отдельно, методы отдельно struct Node { Node* next; void* data; }; struct List { Node* first; int size; }; void* allocate() { … } void.

Slides:



Advertisements
Similar presentations
Chapter 22 Implementing lists: linked implementations.
Advertisements

Linked Lists Mohammed Almashat CS /03/2006.
Linked Lists.
Lists A list is a finite, ordered sequence of data items. Important concept: List elements have a position. Notation: What operations should we implement?
Double Linked List Operations Dr. David Tsai 2010/4/12.
Operator overloading redefine the operations of operators
Data Structure Lecture-5
Overloading Operators Overloading operators Unary operators Binary operators Member, non-member operators Friend functions and classes Function templates.
Chapter 17 Templates. Generic Algorithms Algorithms in which the actions or steps are defined, but the data types of the items being manipulated are not.
CMSC 202, Version 2/02 1 Operator Overloading Strong Suggestion: Go over the Array class example in Section 8.8 of your text. (You may ignore the Array.
1 CSC 211 Data Structures Lecture 22 Dr. Iftikhar Azim Niaz 1.
Computer Programming Link List (Insertion, Printing and Deletion functions) Lecture 23.
Linked Lists
ООП Классы – 2. Ссылки Ссылка – еще одно имя объекта. Используйте ссылки вместо указателя. Это более безопасно. Complex c(10,10); Complex c2& = c; c2+=10;
Особенности Java. Блок static static { } Создание и уничтожение объектов  new – создание объекта  finalyze()
Язык JavaScript Скриптовый язык для выполнения на html-страницах.
List as an Abstract Data Type. struct Node{ public: int data; Node* next; }; typedef Node* Nodeptr; class List { public: List(); // constructor List(const.
Контейнеры. Сортировка  Метод sort()  Интерфейс Comparable метод int compareTo(Object o) вызов: Arrays.sort(a)  Интерфейс Comparator метод int compare(Object.
List as an Abstract Data Type. struct Node{ public: int data; Node* next; }; typedef Node* Nodeptr; class list { public: list(); // constructor list(const.
COMP103 - Linked Lists (Part B)1 Chapter 17 Linked List as Objects.
Синтаксис языка Java.
Linked Lists CSC 172 SPRING 2004 LECTURE 6. ANNOUNCEMENTS Project 2 due Wed, Feb 18 th, 5PM, CSB Read Weiss Chapter 17 Department T shirts available $10.
Queues CS-240 & CS-341 Dick Steflik. Queues First In, First Out operation - FIFO As items are added they are chronologically ordered, items are removed.
Dynamic Allocation and Linked Lists. Dynamic memory allocation in C C uses the functions malloc() and free() to implement dynamic allocation. malloc is.
Linked Structures, Project 1: Linked List Bryce Boe 2013/07/11 CS24, Summer 2013 C.
CMSC 341 Lists 3. 2 Doubly-Linked Lists Option: add pointer to previous node Issues –doubles number of pointers –allows immediate (O(1)) access to previous.
Reference: Vinu V Das, Principles of Data Structures using C and C++
Linear List Linked Representation. Linked Representation list elements are stored, in memory, in an arbitrary order explicit information (called a link)
C++ Tutorial Hany Samuel and Douglas Wilhelm Harder Department of Electrical and Computer Engineering University of Waterloo Copyright © 2006 by Douglas.
1 Chapter 7 Stacks and Queues. 2 Stack ADT Recall that ADT is abstract data type, a set of data and a set of operations that act upon the data. In a stack,
CSC2100B Tutorial 2 List and stack implementation.
Lists, Stacks and Queues in C Yang Zhengwei CSCI2100B Data Structures Tutorial 4.
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Slide
Copyright © 2012 Pearson Education, Inc. Chapter 17: Linked Lists.
Программирование под NX с использованием
APS105 Lists. Structures Arrays allow a collection of elements –All of the same type How to collect elements of different types? –Structures; in C: struct.
Review 1 Polish Notation Prefix Infix Postfix Precedence of Operators Converting Infix to Postfix Evaluating Postfix.
1 Today’s Material List ADT –Definition List ADT Implementation: LinkedList.
M180: Data Structures & Algorithms in Java Linked Lists Arab Open University 1.
Lecture 20 Stacks and Queues. Stacks, Queues and Priority Queues Stacks – first-in-last-out structure – used for function evaluation (run-time stack)
Anekdot ANDROID CLUB Сегодня  Navigation Drawer  CardView  Calligraphy  TextToSpeech.
Linked Lists. Array List Issues Painful insert/remove at start/middle.
ICOM 4035 – Data Structures Dr. Manuel Rodríguez Martínez Electrical and Computer Engineering Department.
Print Row Function void PrintRow(float x[ ][4],int i) { int j; for(j=0;j
Linked List.  Is a series of connected nodes, where each node is a data structure with data and pointer(s) Advantages over array implementation  Can.
1 Linked List. Outline Introduction Insertion Description Deletion Description Basic Node Implementation Conclusion.
Int fact (int n) { If (n == 0) return 1; else return n * fact (n – 1); } 5 void main () { Int Sum; : Sum = fact (5); : } Factorial Program Using Recursion.
Linked Lists Chapter Introduction To The Linked List ADT Linked list: set of data structures (nodes) that contain references to other data structures.
Linked Lists and Generics Written by J.J. Shepherd.
1 Another Example: Complex Class #ifndef _Complex_H #define _Complex_H class Complex { float re, im; // by default private public: Complex(float x = 0,
© Oxford University Press All rights reserved. Data Structures Using C, 2e Reema Thareja.
1 CSE 2341 Object Oriented Programming with C++ Note Set #18.
C++ : Operator overloading example
Lecture No.04 Data Structures Dr. Sohail Aslam
UNIT – I Linked Lists.
Linked List.
Lecture No.03 Data Structures Dr. Sohail Aslam
Linked lists.
Linked lists Motivation: we can make arrays, but their functionality is slightly limited and can be difficult to work with Biggest issue: size management.
Recursion.
קורס תכנות שיעור 13: רשימות מקושרות.
Chapter 18: Linked Lists.
ليست هاي پيوندي.
Cs212: Data Structures Computer Science Department Lab 7: Stacks.
[Chapter 4; Chapter 6, pp ] CSC 143 Linked Lists [Chapter 4; Chapter 6, pp ]
Linked Lists.
List as an Abstract Data Type
Linked lists.
Linked Lists.
Presentation transcript:

ООП Классы

Данные отдельно, методы отдельно struct Node { Node* next; void* data; }; struct List { Node* first; int size; }; void* allocate() { … } void add (void* cont, void* data) { … } int size (void* cont) { … } void* remove (void* cont, int pos) { … } void release(void* cont) { … } void main() { int a[] = {0,1,2,3,4,5,6,7,8,9}; List* list = (List*)allocate(); add(list, a+1); add(list, a+5); remove(list,1); printf(“Size: %d”, size(list)); release(list); }

Проблема №1: подаем некорректные данные void main() { int a[] = {0,1,2,3,4,5,6,7,8,9}; void* bbb = NULL; List* list = (List*)allocate(); add(bbb, a+1); add(a, a+5); remove(a,1); printf(“Size: %d”, size(bbb)); release(list); }

Данные и методы вместе (объект) struct Node { Node* next; void* data; }; void* allocate() { … } void release(void* cont) { … } struct List { Node* first; int size; void add (void* data) { … } int size () { … } void* remove (int pos) { … } void main() { int a[] = {0,1,2,3,4,5,6,7,8,9}; List* list = (List*)allocate(); list->add(a+1); list->add(a+5); list->remove(1); printf(“Size: %d”, list->size()); release(list); }

Проблема №2: не защищено создание и удаление void main() { int a[] = {0,1,2,3,4,5,6,7,8,9}; void* bbb = NULL; List* list = (int*)allocate(); list->add(a+1); list->add(a+5); list->remove(1); printf(“Size: %d”, list->size()); release(bbb); } void main() { int a[] = {0,1,2,3,4,5,6,7,8,9}; void* bbb = NULL; List list = ??? // мы знаем только как создавать указатель на структуру List }

Не получается void main() { int a[] = {0,1,2,3,4,5,6,7,8,9}; void* bbb = NULL; List* list = ???->allocate(); list->add(a+1); list->add(a+5); list->remove(1); printf(“Size: %d”, list->size()); list->release(); free(list); // две операции } struct List { Node* first; int size; void add (void* data) { … } List* allocate() { … } List allocate2() { … } void release() { … }

Конструктор и деструктор struct Node { Node* next; void* data; }; struct List { Node* first; int size; List() { … } // конструктор void add (void* data) { … } int size () { … } void* remove (int pos) { … } ~List() { …} // деструктор } void main() { int a[] = {0,1,2,3,4,5,6,7,8,9}; List* list = new List(); list->add(a+1); list->add(a+5); list->remove(1); printf(“Size: %d”, list->size()); delete list; // ~List() } void main() { int a[] = {0,1,2,3,4,5,6,7,8,9}; List list(); list.add(a+1); list.add(a+5); list.remove(1); printf(“Size: %d”, list.size()); } // после завершения функции выполнится деструктор ~List()

Бонус: несколько конструкторов struct Node { Node* next; void* data; }; struct List { Node* first; int size; List() { … } //создать пустой список List(int* array, int array_size) { … } // создать список и заполнить его данными из массива } void main() { int a[] = {0,1,2,3,4,5,6,7,8,9}; List* list = new List (a, 10); printf(“Size: %d”, list->size()); // 10 delete list; // ~List() } void main() { int a[] = {0,1,2,3,4,5,6,7,8,9}; List list(a, 10); printf(“Size: %d”, list.size()); // 10 } // после завершения функции выполнится деструктор ~List()

Проблема №3: портим состояние объекта void main() { int a[] = {0,1,2,3,4,5,6,7,8,9}; List* list = new List(); list->add(a+1); list->add(a+5); list->remove(1); list->first = NULL; // не освободили память предварительно list->size = 1000; // некорректный размер printf(“Size: %d”, list->size()); // покажет: 1000 delete list; // ~List() }

Защищаем доступ. Инкапсуляция. struct Node { Node* next; void* data; }; class List { private: Node* first; int size; public: List() { … } // конструктор void add (void* data) { touch(); // no problem … } int size () { return size; // no problem } void* remove (int pos) { touch(); … } ~List() { …} // деструктор private: void touch() { // запоминаем время } void main() { int a[] = {0,1,2,3,4,5,6,7,8,9}; List* list = new List(); list->add(a+1); list->add(a+5); list->remove(1); list->first = NULL; // ошибка компиляции list->size = 1000; // ошибка компиляции printf(“Size: %d”, list->size()); list->touch(); // ошибка компиляции delete list; // ~List() }

Проблема №4: защита вспомогательной структуры class Node { private: Node* next; void* data; }; class List { private: Node* first; int size; public: List() { … } // конструктор void add (void* data) { touch(); // no problem Node newNode = new Node(); newNode->next = NULL; // ошибка компиляции newNode->data = data; // ошибка компиляции … } int size () { return size; // no problem } … } Кто-то может воспользоваться нашей структурой случайно (в своем коде): void main() { Node n* = new Node(); // no problem }

Друзья класса class List; // нужно указать, что класс такой есть class Node { friend List; private: Node* next; void* data; Node() { … }; }; class List { private: Node* first; int size; public: List() { … } // конструктор void add (void* data) { touch(); // no problem Node newNode = new Node(); newNode->next = NULL; // no problem newNode->data = data; // no problem … } … } Кто-то может воспользоваться нашей структурой случайно (в своем коде): void main() { Node n* = new Node(); // ошибка компиляции, конструктор приватный ! }

Соглашение: разделение интерфейса и реализации Файл List.hpp class List; class Node { friend List; private: Node* next; void* data; Node(); }; class List { private: Node* first; int size; public: List(); // конструктор void add (void* data); int size () { return size;// можно оставить } void* remove (int pos) ; ~List(); // деструктор private: void touch() ; } Файл List.cpp #include “List.hpp” Node::Node() { … } List::List() { // конструктор … } void List::add (void* data) { … } void* List::remove (int pos) { … } List::~List() { … } List::touch(){ … }

Бонус: переопределение операций class Complex { private: float myReal; float myImag; public: Complex(float re, float im) { myReal = re; myImag = im; } Complex operator+(Complex c) { Complex sum(myReal+c.myReal, myImag+c.myImag); return sum; } Complex operator+(double re) { Complex sum(myReal+re, myImag); return sum; } Complex operator+(int re) { Complex sum(myReal+re, myImag); return sum; } void print() { printf("Complex: %f %f\n", myReal, myImag); } float& operator[] (int pos) { if (pos ==0) return myReal; else return myImag; } }; // end of class definition // внещний оператор Complex operator+(double d, Complex c2) { Complex sum(d+c2.Real(), c2.Imag()); return sum; }

Бонус: переопределение операций void main() { Complex c1 (1.1, 0); Complex c2 (9,9.9); int i = 0; double d = 0.0; Complex c = c1 + c2; // Вызов: Complex operator+(Complex c) {…} c = c1 + i; // Вызов: Complex operator+(int re) {…} c = c1 + d; // Вызов: Complex operator+(double re) {…} c = d + с1; // Вызов: Complex operator+(double d, Complex c2) {…} c[0] = 1; // Вызов: float& operator[] (int pos) {…} c[1] = 8; // Вызов: float& operator[] (int pos) {…} c.print(); }