pointer-to-object casting και ISO C++

Πιστιόλης Κωνσταντίνος pistiolis at ts.sch.gr
Wed Mar 1 15:24:47 EET 2006


Την Wed, 01 Mar 2006 14:42:22 +0200,ο(η) Giorgos Keramidas  
<keramida at ceid.upatras.gr> έγραψε:

> On 2006-03-01 08:34, Πιστιόλης Κωνσταντίνος <pistiolis at ts.sch.gr> wrote:
>> Δεν είναι καλή προσέγγιση να μετατρέπεις κάτι σε void * για να το
>> περάσεις σε μια συνάρτηση. Δεν ξέρω τι θέλεις να κάνεις, αλλά στις
>> περισσότερες περιπτώσεις δεν υπάρχει λόγος να απενεργοποιείς τους
>> ελέγχους τύπων της C. Και καλά να μετατρέψεις δεδομένα.
>
> Καλά, ας μην είμαστε κι απόλυτοι.  Για παράδειγμα:

Εντάξει, γι' αυτό υπάρχουν και οι void δείκτες άλλωστε.
Αυτό που λέω είναι ότι ***συνήθως*** υπάρχουν καλύτεροι τρόποι, με τους  
οποίους
έχεις και την προστασία ελέγχου τύπων του compiler. Ειδικά αν είσαι και
"φρόνιμο παιδί" και δεν κάνεις και "πολλά πολλά".
Για παράδειγμα, πόσοι χρησιμοποιούν setjmp, unions, ucontext κλπ;
ειδικά σε C++ πολύ λίγοι.
>
> Είναι ένας καλός τρόπος όμως να γράψει κανείς `generic functions'.
> Κι έχει ήδη χρησιμοποιηθεί στο ίδιο το standard της C:
> .....
>   |      void
>   |      qsort(void *base, size_t nmemb, size_t size,
>   |          int (*compar)(const void *, const void *));
>   | [...]
>
Τα μεγάλα πνεύματα συναντιούνται! Αυτό ακρίβώς είχα κάνει κάποτε για να
φτιάξω μια γενική κλάσση που θα αποθηκεύει sorted αντικείμενα και θα τα
βρίσκει με binary search. Δεν έχω τον κώδικα πρόχειρο, αλλά η βασική
κλάση έκανε όλη τη διαχείρηση (με void δείκτες) με τη βοήθεια μιας virtual  
function
int genCmp(const void *obj1, const void *obj2)=0;
Όσες κλάσσεις κληρονομούσαν απ' αυτή όριζαν τη δική τους cmp συνάρτηση,
η οποία ήξερε και τον τύπο των αντικειμένων που αποθηκευόταν τελικά στη
βασική κλάση και έκανε το κατάλληλο cast.


> Δεν υπάρχει καλύτερος τρόπος να γραφτεί μια generic sorting function, που
> να μη χρησιμοποιεί `void *' pointers και να μην είναι υποχρεωτικό να
> φτιάξει κανείς μια ειδική sorting function για κάθε δυνατό τύπο που  
> υπάρχει
> ή θα υπάρξει ποτέ.
σωστά, στη C++ πάνε να τους αντικαταστήσουν με overrided συναρτήσεις, αλλά  
οι void *
είναι πιο γενικοί.

Φιλικά,
Κώστας




More information about the Linux-greek-users mailing list