2016-06-02 24 views
0

Überlastung, habe ich eine Struktur Bike, die wie dieseMit Ostream So auf Zeiger auf Objekte

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'; 
} 

Und eine andere Klasse BikeRentalService, die ein std::vector<Bike*>bikes_m genannt hat aussieht. Diese Klasse hat auch eine Methode print_available_bikes(), die über diese std::vector<Bike*> iterieren und jede Bike mit dem überladenen operator<< drucken soll, das oben gezeigt wird. Diese Methode sieht wie folgt aus:

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; 
      } 
     } 
    } 
} 

Das Problem ist, dass diese Funktion nur die Adressen jener Bike Objekte ausdruckt werden. Das Dereferenzieren der Objekte vor der Verwendung von out << funktioniert ebenfalls nicht. Visual Studio sagt, dass es nicht auf std::basic_ostream verweisen kann, da es sich um eine "gelöschte Funktion" handelt. Das Schreiben der for-Schleife als (auto *bike : bikes_m) ändert nichts.

+1

Aus Ihrer Beschreibung ist es mir nicht klar, wenn Sie 'out << * bike;' ausprobiert haben. – KyleKnoepfel

+1

Ihr 'Operator <<' muss durch Referenz "out". Dann benutze 'out << * bike;'. (Obwohl ich nicht den Punkt der Verwendung eines 'std :: vector ' an erster Stelle sehe.) –

+0

Was sollte ich noch verwenden? – blubbi

Antwort

1

Der Schreib Art und Weise ist die Ostream Betreiber zu überlasten wie folgt:

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'; 
} 

Auch, wie durch @KyleKnoepfel bemerkt man out << bike;-out << *bike; ändern sollte.