Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα, 

 

Εχω το παρακάτω θεματάκι:

 

Ενα 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. 
 
Δεν θέλω υλοποίηση σε κώδικα άλλα περισσότερο θεωρητική εξήγηση.
Δημοσ.

Αυτό που θέλεις απλά δεν γίνεται. Για 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).

  • Like 2
Δημοσ.

Το object σου, είναι αυτό που έκανες new. Οπώς και να το δεις (casting), το object μένει ίδιο.

 

Εαν ΕΣΥ θες να δεις τι κουβαλάει ένα interface, τοτε ενεγοποιεις το rtti και παίζεις με το typeinfo.name

  • Like 1
Δημοσ.

Παιδιά να μην γίνετε το θεωρώ αδύνατο γιατί είναι άσκηση. Μάλλον δεν το περιέγραψα καλά. Ανεβάζω το σκελετό που μου έχει δωθεί για να καταλάβετε καλύτερα τι εννοώ: http://ideone.com/KMGGdo. Ευχαριστώ .

Δημοσ.

Εισαι σιγουρος οτι αυτο θελει η ασκηση; Εαν ναι, τοτε ειναι οτι να'ναι.

 

Οπως ειπα και πανω. Το object σου ειναι το new C(), οτι cast να κανεις, το WhoAmI θα επιστρεφει C.

Δημοσ.

Δεν έχω ιδέα τι λέει η άσκηση αλλά ο σκελετός που έβαλες είναι απλά ένας άθλιος τρόπος να κάνεις static_cast. Και πραγματικά δεν έχω ιδέα τι υποτίθεται ότι θέλει να σου δείξει.

 

ΥΓ: Είναι αδύνατο. Αν τώρα η άσκηση προτίθεται να κάνει βλακείες για να "υλοποιήσει" μια συγκεκριμένη υποπερίπτωση του αδύνατου που είναι δυνατή... whatever.

Δημοσ.

Ας το αφήσουμε το παραπάνω γιατί ειλικρινά έχω μπερδευτεί πολύ.

 

Κάτι άλλο...

 

Έστω ο παρακάτω απλή κλάση

class Buffer{
	
private:	
	mutable std::string toString;
	mutable bool toStringDirty;
public:	
	const std::string ToString (void) const;
	
};

Πως θα μπορούσαμε να υλοποιήσουμε την ToString με την λειτουργία caching; Τι καταλαβαίνεται με το "λειτουργία caching";

Δημοσ.

Ας το αφήσουμε το παραπάνω γιατί ειλικρινά έχω μπερδευτεί πολύ.

 

Κάτι άλλο...

 

Έστω ο παρακάτω απλή κλάση

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.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...