nik324 Δημοσ. 1 Φεβρουαρίου 2015 Δημοσ. 1 Φεβρουαρίου 2015 Καλησπέρα, Εχω το παρακάτω θεματάκι: Ενα Interface το οποίο περιέχει τις συναρτήσεις virtual void* CastTo (const std::string& classId) = 0; virtual const void* CastTo (const std::string& classId) const = 0; Και θέλω να επιστρέφουν τη διεύθυνση του base object του οποίου η κλάση κάνει match το classId argument, αλλιώς επιστρέφει null. Θεωρείστε ότι έχουμε την ιεραρχία κλάσεων Interface_class - A - B - C και η μια κληρονομεί τα χαρακτηριστικά της άλλης. Αυτο που θέλω είναι να υλοποιήσω ένα μηχανισμό για downcasting. Απλα δεν μπορώ να καταλάβω με τίποτα με ποιον τρόπο θα έχω δύο διαφορετικές υλοποιήσεις για την CastTo. Δεν θέλω υλοποίηση σε κώδικα άλλα περισσότερο θεωρητική εξήγηση.
defacer Δημοσ. 2 Φεβρουαρίου 2015 Δημοσ. 2 Φεβρουαρίου 2015 Αυτό που θέλεις απλά δεν γίνεται. Για downcasting χρησιμοποιείς static_cast αν είσαι σίγουρος πως θα πετύχει, dynamic_cast (το οποίο προϋποθέτει ενεργοποιημένο RTTI κατά το compile) αν δεν είσαι. Μπορείς να δεις και το boost::polymorphic_cast το οποίο είναι στην ουσία το ίδιο πράγμα. That said οι περιπτώσεις όπου χρειάζεται να κάνεις downcast είναι υπερβολικά σπάνιες και συνήθως indication that you are doing something wrong. Επίσης δεν είναι ξεκάθαρο πώς εννοείς "τη διεύθυνση του base object του οποίου η κλάση κάνει match", φαίνεται να πιστεύεις ότι υπάρχουν ξεχωριστά base objects στο memory layout για κάθε class. Αυτό δεν ισχύει. Τέλος οι περιπτώσεις όπου είναι ΟΚ να χρησιμοποιήσει κανείς void* σε C++ είναι μετρημένες στα δάχτυλα και αυτό που κάνεις εδώ δεν είναι μία από αυτές (=> indication that you are doing something wrong). 2
παπι Δημοσ. 2 Φεβρουαρίου 2015 Δημοσ. 2 Φεβρουαρίου 2015 Το object σου, είναι αυτό που έκανες new. Οπώς και να το δεις (casting), το object μένει ίδιο. Εαν ΕΣΥ θες να δεις τι κουβαλάει ένα interface, τοτε ενεγοποιεις το rtti και παίζεις με το typeinfo.name 1
nik324 Δημοσ. 2 Φεβρουαρίου 2015 Μέλος Δημοσ. 2 Φεβρουαρίου 2015 Παιδιά να μην γίνετε το θεωρώ αδύνατο γιατί είναι άσκηση. Μάλλον δεν το περιέγραψα καλά. Ανεβάζω το σκελετό που μου έχει δωθεί για να καταλάβετε καλύτερα τι εννοώ: http://ideone.com/KMGGdo. Ευχαριστώ .
παπι Δημοσ. 2 Φεβρουαρίου 2015 Δημοσ. 2 Φεβρουαρίου 2015 Εισαι σιγουρος οτι αυτο θελει η ασκηση; Εαν ναι, τοτε ειναι οτι να'ναι. Οπως ειπα και πανω. Το object σου ειναι το new C(), οτι cast να κανεις, το WhoAmI θα επιστρεφει C.
defacer Δημοσ. 2 Φεβρουαρίου 2015 Δημοσ. 2 Φεβρουαρίου 2015 Δεν έχω ιδέα τι λέει η άσκηση αλλά ο σκελετός που έβαλες είναι απλά ένας άθλιος τρόπος να κάνεις static_cast. Και πραγματικά δεν έχω ιδέα τι υποτίθεται ότι θέλει να σου δείξει. ΥΓ: Είναι αδύνατο. Αν τώρα η άσκηση προτίθεται να κάνει βλακείες για να "υλοποιήσει" μια συγκεκριμένη υποπερίπτωση του αδύνατου που είναι δυνατή... whatever.
nik324 Δημοσ. 2 Φεβρουαρίου 2015 Μέλος Δημοσ. 2 Φεβρουαρίου 2015 Ας το αφήσουμε το παραπάνω γιατί ειλικρινά έχω μπερδευτεί πολύ. Κάτι άλλο... Έστω ο παρακάτω απλή κλάση class Buffer{ private: mutable std::string toString; mutable bool toStringDirty; public: const std::string ToString (void) const; }; Πως θα μπορούσαμε να υλοποιήσουμε την ToString με την λειτουργία caching; Τι καταλαβαίνεται με το "λειτουργία caching";
Moderators Kercyn Δημοσ. 2 Φεβρουαρίου 2015 Moderators Δημοσ. 2 Φεβρουαρίου 2015 Βρήκα αυτό, ίσως βοηθήσει. http://www.highprogrammer.com/alan/rants/mutable.html
παπι Δημοσ. 3 Φεβρουαρίου 2015 Δημοσ. 3 Φεβρουαρίου 2015 Ας το αφήσουμε το παραπάνω γιατί ειλικρινά έχω μπερδευτεί πολύ. Κάτι άλλο... Έστω ο παρακάτω απλή κλάση class Buffer{ private: mutable std::string toString; mutable bool toStringDirty; public: const std::string ToString (void) const; }; Πως θα μπορούσαμε να υλοποιήσουμε την ToString με την λειτουργία caching; Τι καταλαβαίνεται με το "λειτουργία caching"; ::toString() τσεκ, εχω cach? >οχι, κανω toString αυτα που θελω και τα βαζω σε ενα buffer (string) >ναι, επιστρεφω τον buffer ::someSideEffectMethod δεν εχω cach fix const std::string& ToString (void) const; Δεν έχω ιδέα τι λέει η άσκηση αλλά ο σκελετός που έβαλες είναι απλά ένας άθλιος τρόπος να κάνεις static_cast. Και πραγματικά δεν έχω ιδέα τι υποτίθεται ότι θέλει να σου δείξει. ΥΓ: Είναι αδύνατο. Αν τώρα η άσκηση προτίθεται να κάνει βλακείες για να "υλοποιήσει" μια συγκεκριμένη υποπερίπτωση του αδύνατου που είναι δυνατή... whatever. Δεν ξερω εαν το προσεξες, αλλα ζηταει απο το U::cast<T> , να εχεις U::T::method ως call, και οχι U::method. Αρα 1) hack το vtbl που λογικα ειναι UB του κερατα 2) clone στη base που πρακτικα δεν ειναι cast.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα