kfoynt Δημοσ. 4 Οκτωβρίου 2008 Δημοσ. 4 Οκτωβρίου 2008 Καλησπέρα, έχω αυτο το πρόβλημα.. Ορισμός : istream& operator >> ( istream&, Type_of_move& ); // ΕΡΡΟΡ istream& Problem::operator >>( istream& in, Type_of_move& type_of_move ) { uint val; if( in >> val ) { switch( val ) { case ONE_PER_ONE_M: case ONE_PER_ONE: case ZERO_PER_ONE_M: case ZERO_PER_ONE: case TWO_OPT: case TWO_OPT_M: type_of_move = Type_of_move( val ); break; default : throw out_of_range ( " Invalid Move " ); } } return in; } Το ΕΡΡΟΡ ειναι : must take exactly one argument!! To ξέρω ότι ειναι προφανές... αλλά δεν ειναι... :-D:-D γιατι overload για >> γίνεται έτσι..σε ότι παραδείγματα και αν εχω δει..!! Καμία ιδεα???
bilco Δημοσ. 4 Οκτωβρίου 2008 Δημοσ. 4 Οκτωβρίου 2008 Καταρχήν, καλό θα ήταν να γράφεις τον κώδικα μέσα σε code blocks, για να είναι ευανάγνωστος. Πρέπει να αποφασίσεις τι overloading θέλεις. Global ή σε κλάση; Αν ορίσεις δηλαδή την > istream& operator >>( istream& in, Type_of_move& type_of_move ) { ... } ακριβώς όπως την υλοποίησες, αλλά εκτός κλάσης, έχεις ένα global overloading που επηρεάζει κάθε κλάση που κληρονομεί την istream. Αν την ορίσεις μέσα στην κλάση σου (που κληρονομεί την isstream ή κάποια απόγονο της istream) τότε δέχεται μόνο ένα όρισμα. Το αριστερό όρισμα του τελεστή >> είναι η παρουσία της κλάση σου. > YourClass& YourClass::operator >>( Type_of_move& type_of_move ) { ... } και βάζεις στη θέση του in >> val το istream:: operator>>(val) και επιστρέφεις return *this;
kfoynt Δημοσ. 4 Οκτωβρίου 2008 Μέλος Δημοσ. 4 Οκτωβρίου 2008 Tα blocks είναι λόγο του copy paste.. :-D Λοιπον, η Αρχιτεκτονική μου ειναι η εξής έχω μια Problem.h με τους ορισμους και μία Problem.cpp έχω ορίσει μία enum : enum Type_of_move { ONE_PER_ONE_M = 1, ONE_PER_ONE = 2, ZERO_PER_ONE_M = 3, ZERO_PER_ONE = 4, TWO_OPT = 5, TWO_OPT_M = 6 }; και μία private μεταβλητή Type_of_move type_of_move; οι ορισμοι των συναρτήσεων που με ενδιαφέρουν είναι : void set_Type_of_move( istream & type_of_move, ostream & output ); void Problem::set_Type_of_move( istream & type_of_move, ostream & output ) { output << " Choose the Type of the Neighborhood \n " << " Type \' 1 \' for ONE_PER_ONE_M \n" << " Type \' 2 \' for ONE_PER_ONE \n" << " Type \' 3 \' for ZERO_PER_ONE_M \n" << " Type \' 4 \' for ZERO_PER_ONE \n" << " Type \' 5 \' for TWO_OPT \n" << " Type \' 6 \' for TWO_OPT_M \n"; type_of_move >> this -> type_of_move; // ERROR : NO MATCH FOR OPERATOR>> κτλ κτλ, για αυτο τον λόγο κάνω και το overload } Οπότε κάνω τα εξής : istream& operator>> ( Type_of_move& ); //ΜΕΣΑ ΣΤΗΝ ΚΛΑΣΗ ΕΤΣΙ ΟΠΩΣ ΜΟΥ ΕΙΠΕΣ... istream& Problem::operator>>( Type_of_move& type_of_move ) { uint val; istream *stream; stream -> operator>>( val ); switch( val ) { case ONE_PER_ONE_M: case ONE_PER_ONE: case ZERO_PER_ONE_M: case ZERO_PER_ONE: case TWO_OPT: case TWO_OPT_M: type_of_move = Type_of_move( val ); break; default : throw out_of_range ( " Invalid Move " ); } return *stream; } Τώρα στο overload δεν έχω error αλλα δν λύνεται το πρόβλημα που είπα στην αρχή...:-D Επίσης έχω άλλη μία απορία.. όταν καλέσω την set ( που έχω πιο πάνω ) πως θα την καλέσω???? Ευχαριστώ!!!!
bilco Δημοσ. 4 Οκτωβρίου 2008 Δημοσ. 4 Οκτωβρίου 2008 Tα blocks είναι λόγο του copy paste.. :-D Γιατί δεν κάνεις paste μέσα σε code tags? Οπότε κάνω τα εξής : istream& operator>> ( Type_of_move& ); //ΜΕΣΑ ΣΤΗΝ ΚΛΑΣΗ ΕΤΣΙ ΟΠΩΣ ΜΟΥ ΕΙΠΕΣ... Εγώ σου είπα να διαλέξεις ανάλογα με το τι θέλεις να κάνεις. Εδώ προφανώς θέλεις global overloading αφού η μέθοδος δέχεται αόριστα κάποιο istream, στο οποίο χρησιμοποιείς τον overloaded operator >>. Και τελικά μπορείς να μην κάνεις και καθόλου overloading και να ακολουθήσεις τον τρόπο που σου είχε προτείνει ο bxenos σε αυτό το post Επίσης έχω άλλη μία απορία.. όταν καλέσω την set ( που έχω πιο πάνω ) πως θα την καλέσω? Μάλλον με τα cin και cout ως ορίσματα, αλλα πάλι εσύ φτιάχνεις το πρόγραμμα και ρωτάς εμένα να σου πω, τι είχες στο μυαλό σου όταν διάλεγες ως ορίσματα τα istream και ostream
kfoynt Δημοσ. 4 Οκτωβρίου 2008 Μέλος Δημοσ. 4 Οκτωβρίου 2008 Εγώ σου είπα να διαλέξεις ανάλογα με το τι θέλεις να κάνεις. Εδώ προφανώς θέλεις global overloading αφού η μέθοδος δέχεται αόριστα κάποιο istream, στο οποίο χρησιμοποιείς τον overloaded operator >>. Μάλλον με τα cin και cout ως ορίσματα, αλλα πάλι εσύ φτιάχνεις το πρόγραμμα και ρωτάς εμένα να σου πω, τι είχες στο μυαλό σου όταν διάλεγες ως ορίσματα τα istream και ostream οχι δεν θελω αόριστα κάποιο istream θέλω αυτό που θα εισάγει ο χρήστης απο το πληκτρολόγιο...δλδ, o χρήστης θα εισάγει int o οποιος θα εισάγεται σε μία μεταβλητή τύπου enum μέσω της set() αρα το σωστό πως θα ήταν? θέλω μέσα στην κλάση Problem να μπορώ να κάνω overload τον operator >> για να τον χρησιμοποιώ και με τύπους enum! -----Προστέθηκε 4/10/2008 στις 05 : 12 : 13----- βεβαια και να ειναι global..δεν με χαλάει.. το μόνο που θέλω είναι να καταλάβω πως λειτουργούν..και να δουλέψει και αυτο που θέλω να κάνω φυσικά...:-D
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.