2016-01-07 1 views
0

tout le monde.opérateur << surcharge pour vecteur d'objets

J'ai une classe appelée "Card" et "CardDeck" où la seconde est un vecteur, qui contient beaucoup de cartes de la première classe.

Mon < < surcharge va comme ceci:

istream& operator<<(ostream& os, Card& card) { 
    string str; 
    if(cardValueCorrect(card._value)){ 
     str += to_string(card._value); 
    } else { 
     str += card._identier; 
    } 
    str += suitToChar(card._suit); 
    return os << str; 

Et que je pense devrait être bon, au moins le compilateur ne marche pas se plaindre à ce sujet. Le problème commence quand dans mon CardDeck Je veux surcharger < < il serait donc imprimer toutes les cartes sont en

CardDeck << overloading seems like that: 
ostream& operator<<(ostream& os, CardDeck& odeck){ 
    for(const Card cur_card: odeck._Deck){ 
     os << cur_card << ' '; 
    } 
    return os; 
} 

Il se plaint de l'accès aux champs privés de cartes et aussi:.

invalid initialization of reference of type 'std::istream& {aka std::basic_istream<char>&}' from expression of type 'std::basic_ostream<char>' 

et puis d'autres choses très étrange que (environ chaque ligne dans la première surcharge d'opérateur):

within this context 

ÉDIT

istream à ostream corrigé.

C'était un problème. Maintenant, je vois 162 warrnings avec "info" sur la surcharge de l'opérateur CardDeck et il me dit que je suis se rendre aux champs privés de CardDeck (le vecteur est là).

Eather:

`invalid initialization of non-const reference of type 'CardDeck&' from an rvalue of type no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'const Card')` 

et beaucoup d ' "info" (éclipse) d'un tel motif répétitif:

'const Card' is not derived from 'const std::extreme_value_distribution<_RealType>' 
+1

Vous devriez vraiment passer 'const Card & 'et' const CardDeck & 'à' operator << '. – PaulMcKenzie

+1

Généralement, l'opérateur surchargé est déclaré comme ami dans une classe: 'ami std :: ostream & operator << (std :: ostream & os, const Carte et carte);' Cette * amitié * permet à l'opérateur autonome << d'accéder à la fonction les membres privés et protégés 'Card'. –

+1

BTW, avoir le nom de la classe et le nom de la variable ne diffèrent que par cas est une mauvaise pratique. Considérez les problèmes lorsque les erreurs typographiques se produisent. La directive de codage habituelle est d'avoir des noms de variables différents des noms de classe par plus de cas. –

Répondre

2

Remplacer

istream& operator<<(ostream& os, Card& card) 

avec

ostream& operator<<(ostream& os, Card& card) 
+0

J'ai modifié la question ci-dessus en fonction de ce problème (l'un des nombreux). – KittyT2016