| Both sides previous revisionPrevious revisionNext revision | Previous revision |
| cpp:interfaces [2019/05/10 07:21] – gthanos | cpp:interfaces [Unknown date] (current) – external edit (Unknown date) 127.0.0.1 |
|---|
| capacity = cap; | capacity = cap; |
| stackSize = 0; | stackSize = 0; |
| array = new (nothrow) int[capacity]; | array = new int[capacity]; |
| } | } |
| |
| 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]; |
| |
| 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++; |
| </code> | </code> |
| |
| Ένα Makefile που μεταγλωττίζει τον παραπάνω κώδικα είναι το εξής: | Το Makefile που μεταγλωττίζει τον παραπάνω κώδικα είναι το εξής: |
| <code makefile Makefile> | <code makefile Makefile> |
| |
| clean: | clean: |
| rm *.o StackUsage | rm *.o StackUsage |
| |
| </code> | </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++, καθώς επιτρέπει να υπάρχουν δεδομένα και default υλοποιήσεις σε ένα //interface//. Σε κάθε περίπτωση, εάν μία κλάση περιέχει μόνο //pure virtual// συναρτήσεις μπορείτε να θεωρήσετε ότι αντιπροσωπεύει ένα //interface//. | Τα //interfaces// στη C++ υλοποιούνται αποκλειστικά μέσω //abstract// κλάσεων που περιέχουν //pure virtual// συναρτήσεις. Είναι προφανές ότι μία //abstract// κλάση εκτός από //pure virtual// συναρτήσεις μπορεί να περιέχει και //virtual// συναρτήσεις και κανονικές συναρτήσεις, αλλά και μεταβλητές (πεδία). Η παραπάνω παραδοχή "θολώνει" λίγο την έννοια του //interface// στη C++, καθώς επιτρέπει να υπάρχουν δεδομένα και default υλοποιήσεις σε ένα //interface//. Σε κάθε περίπτωση, εάν μία κλάση περιέχει μόνο //pure virtual// συναρτήσεις μπορείτε να θεωρήσετε ότι αντιπροσωπεύει ένα //interface//. |
| </WRAP> | </WRAP> |
| |