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> |
| |