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

Help Overload Operator >>


kfoynt

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

Δημοσ.

Καλησπέρα, έχω αυτο το πρόβλημα..

 

Ορισμός :

 

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

γιατι overload για >> γίνεται έτσι..σε ότι παραδείγματα και αν εχω δει..!!

 

Καμία ιδεα???

Δημοσ.

Καταρχήν, καλό θα ήταν να γράφεις τον κώδικα μέσα σε 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;

Δημοσ.

Tα blocks είναι λόγο του copy paste.. :-D:-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:-D

 

Επίσης έχω άλλη μία απορία.. όταν καλέσω την set ( που έχω πιο πάνω ) πως θα την καλέσω????

 

Ευχαριστώ!!!!

Δημοσ.
Tα blocks είναι λόγο του copy paste.. :-D:-D

Γιατί δεν κάνεις paste μέσα σε code tags?

 

Οπότε κάνω τα εξής :

 

istream& operator>> ( Type_of_move& ); //ΜΕΣΑ ΣΤΗΝ ΚΛΑΣΗ ΕΤΣΙ ΟΠΩΣ ΜΟΥ ΕΙΠΕΣ... :-)

Εγώ σου είπα να διαλέξεις ανάλογα με το τι θέλεις να κάνεις. Εδώ προφανώς θέλεις global overloading αφού η μέθοδος δέχεται αόριστα κάποιο istream, στο οποίο χρησιμοποιείς τον overloaded operator >>.

 

Και τελικά μπορείς να μην κάνεις και καθόλου overloading και να ακολουθήσεις τον τρόπο που σου είχε προτείνει ο bxenos σε αυτό το post

 

Επίσης έχω άλλη μία απορία.. όταν καλέσω την set ( που έχω πιο πάνω ) πως θα την καλέσω?

Μάλλον με τα cin και cout ως ορίσματα, αλλα πάλι εσύ φτιάχνεις το πρόγραμμα και ρωτάς εμένα να σου πω, τι είχες στο μυαλό σου όταν διάλεγες ως ορίσματα τα istream και ostream :shock: :confused:

Δημοσ.

 

 

Εγώ σου είπα να διαλέξεις ανάλογα με το τι θέλεις να κάνεις. Εδώ προφανώς θέλεις global overloading αφού η μέθοδος δέχεται αόριστα κάποιο istream, στο οποίο χρησιμοποιείς τον overloaded operator >>.

 

 

Μάλλον με τα cin και cout ως ορίσματα, αλλα πάλι εσύ φτιάχνεις το πρόγραμμα και ρωτάς εμένα να σου πω, τι είχες στο μυαλό σου όταν διάλεγες ως ορίσματα τα istream και ostream :shock: :confused:

 

οχι δεν θελω αόριστα κάποιο istream θέλω αυτό που θα εισάγει ο χρήστης απο το πληκτρολόγιο...δλδ, o χρήστης θα εισάγει int o οποιος θα εισάγεται σε μία μεταβλητή τύπου enum μέσω της set() αρα το σωστό πως θα ήταν?

 

θέλω μέσα στην κλάση Problem να μπορώ να κάνω overload τον operator >> για να τον χρησιμοποιώ και με τύπους enum!

 

 

-----Προστέθηκε 4/10/2008 στις 05 : 12 : 13-----

 

 

βεβαια και να ειναι global..δεν με χαλάει.. το μόνο που θέλω είναι να καταλάβω πως λειτουργούν..και να δουλέψει και αυτο που θέλω να κάνω φυσικά...:-D:-D

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...