2016-06-02 4 views
0

Alors, j'ai une struct Bike, qui ressemble à ceEn utilisant ostream surcharge sur des pointeurs vers des objets

struct Bike { 
    std::string brand; 
    std::string model; 
    bool is_reserved; 

    friend std::ostream& operator<<(std::ostream out, const Bike& b); 
}; 
std::ostream& operator<<(std::ostream out, const Bike& b) { 
    return out 
     << "| Brand: " << b.brand << '\n' 
     << "| Model: " << b.model << '\n'; 
} 

Et une autre classe BikeRentalService, qui a un std::vector<Bike*> appelé bikes_m. Cette classe a également une méthode print_available_bikes(), qui est censée parcourir sur ladite std::vector<Bike*> et imprimer chaque Bike en utilisant le operator<< surchargé montré ci-dessus. Cette méthode ressemble que:

void BikeRentalService::print_available_bikes(std::ostream& out) { 
    if (bikes_m.empty()) { 
     out << "| None" << '\n'; 
    } 
    else { 
     for (auto bike : bikes_m) { 
      if (!bike->is_reserved) { 
       out << bike; 
      } 
     } 
    } 
} 

Le problème est que l'utilisation de cette fonction se contente d'afficher les adresses de ces Bike objets. Le déréférencement des objets avant l'utilisation de out << ne fonctionne pas non plus, Visual Studio indique qu'il ne peut pas référencer std::basic_ostream car il s'agit d'une "fonction supprimée". L'écriture de la boucle for comme (auto *bike : bikes_m) ne change rien.

+1

D'après votre description, il n'est pas clair pour moi si vous avez essayé «out» * bike; – KyleKnoepfel

+1

Votre 'operator <<' doit prendre 'out' par référence. Ensuite, utilisez 'out << * vélo;'. (Bien que je ne vois pas le point d'utiliser un 'std :: vector ' en premier lieu.) –

+0

Quoi d'autre devrais-je utiliser? – blubbi

Répondre

1

La façon d'écrire surcharger l'opérateur ostream est la suivante:

struct Bike { 
    std::string brand; 
    std::string model; 
    bool is_reserved; 

    friend std::ostream& operator<<(std::ostream& out, const Bike& b); // <- note passing out by reference 
}; 
std::ostream& operator<<(std::ostream& out, const Bike& b) { 
    return out 
     << "| Brand: " << b.brand << '\n' 
     << "| Model: " << b.model << '\n'; 
} 

En outre, comme l'a noté @KyleKnoepfel vous devriez changer out << bike;-out << *bike; aussi.