User Tools

Site Tools


cpp:interfaces

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
cpp:interfaces [2017/04/26 08:11]
gthanos
cpp:interfaces [2019/05/10 07:22]
gthanos
Line 50: Line 50:
   capacity = cap;   capacity = cap;
   stackSize = 0;   stackSize = 0;
-  array = new (nothrow) int[capacity];+  array = new int[capacity];
 } }
  
Line 59: Line 59:
 void ArrayStack::push(int o) { void ArrayStack::push(int o) {
   if(stackSize==capacity) {   if(stackSize==capacity) {
-    int *_array = new (nothrow) int[2*capacity];+    int *_array = new int[2*capacity];
     for(int i=0; i<stackSize; i++)     for(int i=0; i<stackSize; i++)
       _array[i] = array[i];       _array[i] = array[i];
Line 140: Line 140:
  
 void LinkedStack::push(int o) { void LinkedStack::push(int o) {
-  LinkedNode *node = new (nothrow) LinkedNode(head, o);+  LinkedNode *node = new LinkedNode(head, o);
   head = node;   head = node;
   stackSize++;   stackSize++;
Line 192: Line 192:
 </code> </code>
  
-Οι παραπάνω κλάσεις μεταγλωττίζονται ως εξής: +Ένα Makefile που μεταγλωττίζει τον παραπάνω κώδικα είναι το εξής: 
-<code> +<code makefile Makefile> 
-g++ -g -std=c++11 -o stack StackUsage.cpp ArrayStack.cpp LinkedStack.cpp + 
-</code+StackUsage: ArrayStack.o LinkedStack.o 
 + g++ -Wall -g -std=c++11 StackUsage.cpp ArrayStack.o LinkedStack.o -o StackUsage 
 + 
 +ArrayStack.o: ArrayStack.cpp ArrayStack.h 
 + g++ -Wall -g -std=c++11 ArrayStack.cpp -c 
 + 
 +LinkedStack.o: LinkedStack.cpp LinkedStack.h 
 + g++ -Wall -g -std=c++11 LinkedStack.cpp -c 
 +  
 +clean: 
 + rm *.o StackUsage 
 + 
 +</code>
  
 Από τον παραπάνω κώδικα παρατηρούμε ότι η κλάση abstract κλάση //Stack// παρέχει μία σειρά από //virtual// μεθόδους οι οποίες υλοποιούνται στις //ArrayStack// και //LinkedStack//. Η μέθοδος //invertArray// χρησιμοποιεί την abstract κλάση //Stack// ως //interface//. Ανάλογα με το είδος του αντικειμένου τύπου //Stack// με το οποίο θα κληθεί ο παραπάνω κώδικας η εσωτερική υλοποίηση της στοίβας θα είναι διαφορετική. Ο κώδικας όμως που χρησιμοποιεί το //interface// της στοίβας παραμένει αμετάβλητος, ανεξάρτητα από την εσωτερική υλοποίηση. Από τον παραπάνω κώδικα παρατηρούμε ότι η κλάση abstract κλάση //Stack// παρέχει μία σειρά από //virtual// μεθόδους οι οποίες υλοποιούνται στις //ArrayStack// και //LinkedStack//. Η μέθοδος //invertArray// χρησιμοποιεί την abstract κλάση //Stack// ως //interface//. Ανάλογα με το είδος του αντικειμένου τύπου //Stack// με το οποίο θα κληθεί ο παραπάνω κώδικας η εσωτερική υλοποίηση της στοίβας θα είναι διαφορετική. Ο κώδικας όμως που χρησιμοποιεί το //interface// της στοίβας παραμένει αμετάβλητος, ανεξάρτητα από την εσωτερική υλοποίηση.
  
 <WRAP center round tip 80%> <WRAP center round tip 80%>
-Τα //interfaces// στη C++ υλοποιούνται αποκλειστικά μέσω abstract κλάσεων που περιέχουν //pure virtual// συναρτήσεις. Είναι προφανές ότι μία //abstract// κλάση εκτός από //pure virtual// συναρτήσεις μπορεί να περιέχει και //virtual// συναρτήσεις και κανονικές συναρτήσεις. Η παραπάνω παραδοχή "θολώνει" λίγο την έννοια του interface στη C++. Παρόλα αυτά, εάν μία κλάση περιέχει μόνο //pure virtual// συναρτήσεις+Τα //interfaces// στη C++ υλοποιούνται αποκλειστικά μέσω abstract κλάσεων που περιέχουν //pure virtual// συναρτήσεις. Είναι προφανές ότι μία //abstract// κλάση εκτός από //pure virtual// συναρτήσεις μπορεί να περιέχει και //virtual// συναρτήσεις και κανονικές συναρτήσεις, αλλά και μεταβλητές (πεδία). Η παραπάνω παραδοχή "θολώνει" λίγο την έννοια του //interface// στη C++, καθώς επιτρέπει να υπάρχουν δεδομένα και default υλοποιήσεις σε ένα //interface//. Σε κάθε περίπτωση, εάν μία κλάση περιέχει μόνο //pure virtual// συναρτήσεις μπορείτε να θεωρήσετε ότι αντιπροσωπεύει ένα //interface//.
 </WRAP> </WRAP>
  
cpp/interfaces.txt · Last modified: 2021/05/07 08:42 (external edit)