J'écris ce code

ostream& operator <<(ostream& out, Box& B){
    return B.l +" "+B.b +" "+B.h +endl;
};

L'erreur que j'obtiens est

Solution.cpp:40:46: error: ‘std::ostream& Box::operator<<(std::ostream&, Box&)’ must have exactly one argument ostream& operator <<(ostream& out, Box& B){ ^

Quelqu'un peut-il expliquer ce qui ne va pas? Je ne comprends pas.

Merci de votre aide :)

c++
2
BlueBeret 2 avril 2020 à 12:17

3 réponses

Meilleure réponse

Il semble que tu veux dire ce qui suit

std::ostream & operator <<( std::ostream& out, const Box& B) {
    return out << B.l << " " << B.b << " " << B.h;
}

À condition que tous les membres utilisés dans les données de l'opérateur soient des membres de données publiques de la classe Box. L'opérateur doit être déclaré et défini en dehors de la définition de classe.

Si l'un des membres de données utilisés est un membre de données privé de la classe, la fonction doit être une fonction amie de la classe et doit être déclarée (et peut être définie) dans la définition de classe. Par exemple

class Box
{
    //...
    friend std::ostream & operator <<( std::ostream& out, const Box& B) {
        return out << B.l << " " << B.b << " " << B.h;
    }
    //...
};

Faites attention à ce qu'il est préférable de supprimer dans l'instruction return l'opérande std::endl. Dans ce cas 1) l'opérateur sera plus flexible car vous pouvez sortir des informations supplémentaires dans la même ligne et 2) cette instruction

std::cout << box;

Ne confondra pas les lecteurs du code car ils ne verront pas l'opérande std::endl.

Sans cet opérande dans la définition de l'opérateur dans l'appelant de l'opérateur, vous pouvez écrire

std::cout << box << std::endl;

Et cette déclaration exprime plus clairement l'intention du programmeur.

3
Vlad from Moscow 2 avril 2020 à 10:14

Cela devrait probablement être:

std::ostream& operator<<(std::ostream& out, Box const& B){
    out << B.l << " " << B.b << " " << B.h << std::endl;
    return out;
};

Le code complet devrait ressembler à:

#include <iostream>

class Box {
    int l;
    int b;
    int h;

    friend std::ostream& operator<<(std::ostream& out, Box const& B);
};

std::ostream& operator<<(std::ostream& out, Box const& B){
    out << B.l << " " << B.b << " " << B.h << std::endl;
    return out;
}

int main() {
    return 0;
}

Démo

2
NutCracker 2 avril 2020 à 09:26

Pour générer un type T vers std::ostream, vous devez déclarer un opérateur autonome, qui renvoie une référence à ce flux

std::ostream& operator<<(std::ostream& out, const T& B)
{
    out << B.l << " " << B.b << " " << B.h << '\n';
    return out;
}

Cette opération ne peut pas être un opérateur membre car l'opérateur membre utilise sa classe comme premier argument, il peut donc être nécessaire de la déclarer en tant qu'ami de la classe T.

Évitez d'utiliser endl dans de tels opérateurs si ce n'est pas extrêmement nécessaire, ce manipulateur appelle out.flush(). Si vous souhaitez ajouter une nouvelle ligne, utilisez le caractère de nouvelle ligne.

0
Swift - Friday Pie 2 avril 2020 à 09:30