cpp:interfaces

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
cpp:interfaces [2017/04/26 08:11] gthanoscpp:interfaces [Unknown date] (current) – external edit (Unknown date) 127.0.0.1
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> +
-g++ -g -std=c++11 -o stack StackUsage.cpp ArrayStack.cpp LinkedStack.cpp +
-</code+
  
-Από τον παραπάνω κώδικα παρατηρούμε ότι η κλάση abstract κλάση //Stack// παρέχει μία σειρά από //virtual// μεθόδους οι οποίες υλοποιούνται στις //ArrayStack// και //LinkedStack//. Η μέθοδος //invertArray// χρησιμοποιεί την abstract κλάση //Stack// ως //interface//. Ανάλογα με το είδος του αντικειμένου τύπου //Stack// με το οποίο θα κληθεί ο παραπάνω κώδικας η εσωτερική υλοποίηση της στοίβας θα είναι διαφορετική. Ο κώδικας όμως που χρησιμοποιεί το //interface// της στοίβας παραμένει αμετάβλητος, ανεξάρτητα από την εσωτερική υλοποίηση.+<code makefile Makefile> 
 + 
 +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// της στοίβας παραμένει αμετάβλητος, ανεξάρτητα από την εσωτερική υλοποίηση.
  
 <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.1493194272.txt.gz · Last modified: 2017/04/26 07:11 (external edit)