2016-06-12 1 views
-2

J'écris une liste de liens simple, qui fonctionne bien, mais je suis bloqué sur la surcharge de l'ostream (enfin, je ne suis pas sûr si je veux dire ostream ou instream!) :Comment surcharger l'opérateur iostream pour effectuer une fonction sur le flux entier

class List 
{ 
public: 
    void addToEnd(int data); 
    /* operator overloads */ 
    friend std::istream& operator >> (std::istream& is, int data); 
}; 

std::istream& operator>>(std::istream& is, int data) 
{ 
    for(int i = 0; i < is.gcount(); i++) 
    { 
     // how to call ist::addToEnd(data); 
    } 
} 

Je voudrais faire quelque sorte de pouvoir:

List list(); 
list << 2 << 3 << 4; 

pour que j'utiliser ce formulaire au lieu d'appeler addToEnd(X)

+0

BTW, l'instruction 'List list();' déclare une fonction nommée 'list' ne prenant aucun argument et renvoyant un objet de type' List'. Vous avez probablement voulu écrire 'Liste de liste;', Liste de liste {}; 'ou Liste de liste = Liste();' –

+0

@ DietmarKühl ouais merci c'était juste une faute de frappe: P –

Répondre

2

L'exemple que vous présentez est le suivant:

list << 2 << 3 << 4; 

Il est clair que vous avez besoin de surcharger operator <<, non operator >>. Les arguments de la << sont List et int, donc la fonction dont vous avez besoin est:

List& operator <<(List& list, int data) 
{ 
    list.addToEnd(data); 
    return list; 
} 

Notez que cette fonction n'a pas besoin d'être un ami, car il utilise uniquement les méthodes publiques de List.

Aucun istream ou ostream n'est impliqué.

+0

Merci. mais je ne peux pas le compiler. J'ai ajouté 'List & operator << (List & list, int data);' à l'en-tête mais je me suis plaint: trop de paramètres pour cette fonction d'opérateur –

+0

* Où l'avez-vous ajouté? C'est une fonction autonome, elle devrait donc être déclarée en dehors de la classe. (Je serais également enclin à le déclarer en ligne comme il est si court, et le compilateur peut alors voir que c'est juste une série d'appels à 'addToEnd' –

+0

Merci encore, d'abord j'ai ajouté la déclaration dans le fichier d'en-tête pour' Liste 'class., mais alors j'ai seulement ajouté au code source et cela a fonctionné.Cette surcharge n'a donc rien à voir avec l'en-tête ou la classe elle-même? –