Top Banner
Harran Üniversitesi Bilgisaya r Mühendisliği Yrd.Doç.Dr.Nur ettin Beşli Nesneye Dayalı Programlama DERS 8
29

Nesneye Dayal ı Programlama

Feb 25, 2016

Download

Documents

kamin

Nesneye Dayal ı Programlama. DERS 8. Nesne Pointerlar ı. Nesneler hafızada tutulurlar, dolayısıyla pointerlar değişkenlere işaret ettikleri gibi nesnelerede edebilirler. - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Nesneye Dayalı Programlama

DERS 8

Page 2: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Nesne Pointerları Nesneler hafızada tutulurlar, dolayısıyla pointerlar

değişkenlere işaret ettikleri gibi nesnelerede edebilirler.

new operatörü: new operatörü işletim sisteminden belirli miktarda yer talep ederek işgal eder, ve başlangıç noktasına bir pointer dönderir. Eğer yer bulunamadıysa, sıfır pointerına döner.

new operatörünü nesnelerle kullandığınız zaman sadece hafızada nesne için yer tutmakla kalmayıp , nesnenin kurucusunu çağırarak nesneyi de oluşturur. Bu durum nesnenin doğru bir şekilde başlatıldığını garanti eder, ki bu programlama hatalarını önlemede çok önemlidir.

Page 3: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

delete operatörü: Hafızanın verimli ve güvenli bir şekilde kullanıldığından emin olmak için kullanılır. Hafızayı işletim sistemine bırakmak için new operatörünü takiben kullanılır.

Eğer new Type[ ]; şeklinde bir dizi tanımlarsanız, silmek için braket kullanmanız gerekicektir:

int * ptr=new int[10] … … delete [ ] ptr; Not: Dizi nesnelerini silerken braket kullanmayı

unutmayınız.Kullanmak arrayın bütün elemanlarının silindiğinden emin olmamızı sağlar ve her biri için yıkıcıyı çağırır. Eğer braket koymayı unutursanız dizinin sadece ilk elemanı silinir.

Page 4: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Örnek 1:class String{ int size; char *contents; public: String(); // Default constructor String(const char *); // Constructor String(const String &); // Copy constructor const String& operator=(const String &); // A ssignment operator void print() const ; ~String(); // Destructor};int main(){ String *sptr = new String[3]; // 3 tane nesne yaratılır String s1("String_1"); // Bir String nesnesi String s2("String_2"); // Başka bir String nesnesi *sptr = s1; // Dizinin ilk elemanı *(sptr + 1) = s2; // Dizinin ikinci elemanı sptr->print(); // İlk elemanı yazdırır (sptr+1)->print(); // İkinci elemanı yazdırır sptr[1].print(); // İkinci elemanı yazdırır delete[] sptr; // sptr tarafından point

edilen nesneler silindi return 0;}

Page 5: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Pointerlar ve Miras

Eğer Derived sınıfı, public base Base sınıfına sahipse, Derived’a point eden bir pointer, Base’in pointer türünde bir değişkenine tür dönüşmesine gerek kalmadan atanabilir.

Başka bir deyişle Base’e işaret eden bir pointer Derived türünde bir nesnenin adresini taşıyabilir. Tersi durumda, Base pointerından Derived pointerına dönüşüm açık şekilde yapılmalıdır.

Örneğin: Teacher pointerı Teacher nesnelerine de, Principal nesnelerine de işaret edebilir.

Page 6: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Principal bir Teacher’dır ama Teacher her zaman Principal değildir.

class Base{ };class Derived : public Base { };Derived d;Base *bp = &d; // kapalı dönüşümDerived *dp = bp; // HATA! Base Derived değildirdp = static_cast<Derived *>(bp); // açık dönüşüm

Page 7: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Eğer Base sınıfı Derived’ın private türünde temel sınıfı olsaydı, Derived*’dan Base*’e kapalı dönüşüm yapılamazdı.

Çünkü bu durumda Base’in public bir üyesi Base’e işaret eden bir pointer tarafından erilişilebilirdi, Derived’a işaret eden bir pointer tarafından değil.

Page 8: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Örnek 2

class Base{ int m1; public: int m2; // m2 Base sınıfının Public bir üyesidir.}; class Derived : private Base { // m2 Derived’ın public bir üyesi

değildir ...}; Derived d; d.m2 = 5; // HATA! m2 Derived’ın private bir üyesidir Base *bp = &d; // HATA! private base bp = static_cast<Base*>(&d); // ok: açık dönüşüm bp->m2 = 5; // ok

Page 9: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Link List Nesneleri Bir sınıf kendi sınıf türüne ait nesne pointeri içerebilir. Bu pointer,

nesne zinciri(link list) kullanmada kullanılabilir.Örnek 3:class Teacher{ friend class Teacher_list; string name; int age, numOfStudents; Teacher * next; // teacherin bir sonraki nesnesine işaret eder public: Teacher(const string &, int, int); // Constructor void print() const; const string& getName() const { return name;} ~Teacher() // Destructor};

Page 10: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

// öğretmenler için link listclass Teacher_list{ Teacher *head; public: Teacher_list(){head=0;} bool append(const string &,int,int); bool del(const string &); void print() const ; ~Teacher_list();};

Page 11: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Heterojen(Çok Türel) Link Listler ve Polymorphism Türeme ve pointerları kullanarak heterojen link listler

oluşturulabilir. Temel sınıf pointerları türünde tanımlanan bir dizi,

temel sınıftan türeyen herhangi bir sınıfın nesnelerini tutabilir.

Örnek: Teacher’lar ve Principal’lardan oluşan bir dizi.

Page 12: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Örnek 4#include <iostream>#include <string>using namespace std;

class Teacher{friend class HetList;string name;int age,numOfStudents;Teacher * next; // Pointer to next object of Teacher

public:Teacher(const string &, int, int); // Constructorvirtual void print() const;

};Teacher::Teacher(const string &new_name,int a,int nos){

name = new_name;age=a;numOfStudents=nos;

}void Teacher::print() const // Print method of Teacher class{

cout <<"Name: "<< name<<" Age: "<< age<< endl; cout << "Number of Students: " <<numOfStudents << endl;

}

Page 13: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

// Principal class is derived from Teacher classclass Principal: public Teacher{

string SchoolName;public: Principal(const string &, int, int, const string &); // Constructor void print() const ;

};// Constructor of principal Principal::Principal(const string &new_name,int a,int nos, const string &s_name)

:Teacher(new_name,a,nos){

SchoolName = s_name;}

void Principal::print() const // Print method of principal class{

Teacher::print();cout <<"Name od School: "<< SchoolName << endl;

}

// ***** Class of het. linked list *****// It can contain objects of teacher and principalclass HetList{ // Heterogeneous linked list

Teacher *head; public: HetList(){head=0;}

void insert(Teacher *);void print();

};

Page 14: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

// inserts a new teacher or principla at the beginning of the listvoid HetList::insert(Teacher* t){

if(head) // if the list is not emptyt->next=head;

else // if the list is emptyt->next=0; // insert 1st element

head=t;}

// print the elements of the listvoid HetList::print(){

Teacher *tempPtr;if (head){

tempPtr=head;while(tempPtr){

tempPtr->print();tempPtr=tempPtr->next;

}}else

cout << "The list is empty" << endl;}

Page 15: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

// ----- Main Function -----int main(){

HetList theHetList;Teacher *t1=new Teacher("Teacher1",30,50);Principal *p1=new Principal("Principla1",60,40,"School1");Teacher *t2=new Teacher("Teacher2",40,65);theHetList.insert(t1);theHetList.insert(p1);theHetList.insert(t2);theHetList.print();return 0;

}

Page 16: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Node Kullanılarak Link List Nesneleri Sanal fonksiyonların en çok kullanılma yöntemleri: nesnelere pointer dizileri ve linked list nesneleri. ÖRNEK 5:

#include <iostream>#include <string> // Standard header of C++using namespace std;

class Teacher{ //Taban Sınıf

string name;int numOfStudents;public:Teacher(const string & new_name,int nos){ // Constructor of base

name=new_name;numOfStudents=nos;}virtual void print() const; // print sanal bir bir foksiyondur

};

void Teacher::print() const // sanal foksiyon{

cout << "Name: "<< name << endl;cout << " Num of Students:"<< numOfStudents << endl;

}

Page 17: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

class Principal : public Teacher{ // Türemiş sınıfstring SchoolName;public:Principal(const string & new_name,int nos, const string & sn)

:Teacher(new_name,nos){

SchoolName=sn;}void print() const;

};void Principal::print() const

// Sanal olmayan fonksiyon{

Teacher::print();cout << " Name of School:"<< SchoolName << endl;

}

Page 18: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

// *** A class to define nodes of the list ***class ListNode{

friend class List;const Teacher * element;ListNode * next;ListNode(const Teacher &); // constructor

};

ListNode::ListNode(const Teacher & n){

element = &n;next = 0;

}

// *** class to define a linked list of teachers and principals ***class List{ // linked list for teachers

ListNode *head;public: List(){head=0;} bool append(const Teacher &); void print() const ; ~List();

};

Page 19: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Bir önceki örnekte Teacher sınıfından oluşan nesneiçin ve bir sonraki nesneyi göstermek için nesne pointerları olması gerekir. Kullanıcıların bu sınıfı kullanarak link list’in diğer elamalarına erişmesi içinde “list” sınıfının friend olarak tanıtılması gerekir.

Daha sonraki örnektede görülebileceği gibi Teacher sınıfının kendi içinde böyle bir pointer tanıtılabilir. Fakat programcılar genellikle kütüphane(library) sınıfları gibi, başka gruplar tarafından oluşturulmuş hazır sınıfları kullanırlar Ve bu sınıfların next pointerı olmayabilir.

Bu gibi hazır sınıfları kullanarak link list oluşturmak için, programcı Link Listedeki her bir nokta için node sınıfını tanımlamak zorundadır. Node sınıfının her bir nesnesi, dizinin(“list” nesnesindeki bir işaretci) her bir elemanının adresini tutar.

Page 20: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

// Append a new teacher to the end of the list// if there is no space returns false, otherwise truebool List::append(const Teacher & n){

ListNode *previous, *current;if(head) // if the list is not empty{

previous=head;current=head->next;while(current) // Linked list sonunu bulur{

previous=current;current=current->next;

}previous->next = new ListNode(n);if (!(previous->next)) return false; // If memory is full

}else // if the list is empty{

head = new ListNode(n); // Memory for new nodeif (!head) return false; // If memory is full

}return true;

} BURADA EKLEME SAĞA DOĞRU YAPILIR....

Page 21: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

// Prints all elements of the list on the screenvoid List::print() const{

ListNode *tempPtr;if (head){ tempPtr=head; while(tempPtr)

{(tempPtr->element)->print(); //

POLYMORPHISMtempPtr=tempPtr->next;

}}

else cout << "The list is empty" << endl;

}

Page 22: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

// Destructor// deletes all elements of the listList::~List(){

ListNode *temp;while(head) // if the list is not empty{

temp=head; head=head->next; delete temp;

}}

// ----- Main Function -----int main(){

Teacher t1("Teacher 1",50); Principal p1("Principal 1",40,"School1"); Teacher t2("Teacher 2",60); Principal p2("Principal 2",100,"School2");

List theList;theList.print();theList.append(t1);theList.append(p1);theList.append(t2);theList.append(p2);theList.print();return 0;

}

Page 23: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Grafik Örneği

Page 24: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Page 25: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Page 26: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Finite State Machine Örneği

Page 27: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Page 28: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli

Page 29: Nesneye Dayal ı Programlama

Harran Üniversitesi Bilgisayar Mühendisliği Yrd.Doç.Dr.Nurettin Beşli