2014-04-23 9 views
6

Ich möchte eine Druckfunktion für eine Klasse AutoData schreiben, die Informationen über Autos enthält. Mit dieser Druckfunktion möchte ich idealerweise einen Vektor ausgeben, der viele verschiedene Klassenobjekte enthält. Ich habe bereits get-Funktionen für jedes Element der Objekte geschrieben, aber ich bin immer noch ein bisschen unsicher, wie gehen diejenigen über die Verwendung eine Funktion zu schreiben, um die Daten in folgendem Format auszudrucken:Druckfunktion für Klasse C++

mpg:cylinders:displacement:horsepower:weight:acceleration:modelYear:origin:carName 

Zum Beispiel :

10.0:8:360.0:215.0:4615.:14.0:70:1:ford f250 
10.0:8:307.0:200.0:4376.:15.0:70:1:chevy c20 
11.0:8:318.0:210.0:4382.:13.5:70:1:dodge d200 

Die Klasse ist:

#include <string> 
#include <vector> 
#include <iostream> 

using namespace std; 

class AutoData { 

public: 
    AutoData() 
    { 
     mpg = 0; 
     cylinders = 0; 
     displacement = 0; 
     horsepower = 0; 
     weight = 0; 
     acceleration = 0; 
     modelYear = 0; 
     origin = 0; 
     carName = ""; 
    } 

    AutoData(const AutoData & rhs) 
    { 
     setAuto(rhs.mpg, rhs.cylinders, rhs.displacement, rhs.horsepower, rhs.weight, rhs.acceleration, rhs.modelYear, rhs.origin, rhs.carName); 
    } 

    void setAuto(float mp, int cy, float di, float ho, float we, float ac, int mo, int o, string ca) 
    { 
     mpg = mp; 
     cylinders = cy; 
     displacement = di; 
     horsepower = ho; 
     weight = we; 
     acceleration = ac; 
     modelYear = mo; 
     origin = o; 
     carName = ca; 
    } 

    const float & getmpg() const 
    { 
     return mpg; 
    } 

    const int & getcylinders() const 
    { 
     return cylinders; 
    } 

    const float & getdisplacement() const 
    { 
     return displacement; 
    } 

    const float & gethorsepower() const 
    { 
     return horsepower; 
    } 

    const float & getweight() const 
    { 
     return weight; 
    } 

    const float & getacceleration() const 
    { 
     return acceleration; 
    } 

    const int & getmodelYear() const 
    { 
     return modelYear; 
    } 

    const int & getorigin() const 
    { 
     return origin; 
    } 

    const string & getcarName() const 
    { 
     return carName; 
    } 

    bool operator == (const AutoData & rhs) const 
    { 
     if(getmpg() == rhs.getmpg()) 
     { 
      return gethorsepower() == rhs.gethorsepower(); 
     } 

     else 
     { 
      return false; 
     } 
    } 

    bool operator > (const AutoData & rhs) const 
    { 
     if(rhs.getmpg() > getmpg()) 
     { 
      return true; 
     } 

     else if(getmpg() == rhs.getmpg()) 
     { 
      if(rhs.gethorsepower() > gethorsepower()) 
      { 
       return true; 
      } 
     } 

     else 
     { 
      return false; 
     } 
    } 


private: 
    float mpg; 
    int cylinders; 
    float displacement; 
    float horsepower; 
    float weight; 
    float acceleration; 
    int modelYear; 
    int origin; 
    string carName; 
}; 

Jede jemand Hilfe/Beratung kann würde bieten sehr geschätzt !! Dank

+0

wenn Sie nur wollen cout << mpg auf die Konsole drucken << ":" << Zylinder << ":" etc - Wenn Sie in einer Zeichenfolge speichern möchten, verwenden Sie einen Stringstream. – Mike

+0

aber wie würde ich einen ganzen Vektor von diesen ausdrucken? mpg1: cylinders1: etc ... mpg2: cylinders2: etc ... –

+0

Iterieren Sie einfach über den Vektor und fügen Sie Zeilenumbrüche zwischen den Einträgen – stefaanv

Antwort

7

ich Sie wollen in der Lage sein std::cout << AutoData(); zu tun, müssen Sie den Ausgangsstrom Betreiber zu überlasten operator<<:

std::ostream& operator<< (std::ostream &out, AutoData const& data) { 
    out << data.getmpg() << ':'; 
    out << data.getcylinders() << ':'; 
    // and so on... 
    return out; 
} 

Diese Funktion ist kein Mitglied Funktion, und da Sie Getter für jedes Attribut, Sie muss diese Funktion nicht als friend Ihrer Klasse deklarieren.

Dann können Sie tun:

AutoData myAuto; 
std::cout << myAuto << '\n'; 
+1

Ich finde die 'const &' -Notation sehr verwirrend (lenkt von der Tatsache ab, dass die zugrundeliegende 'AutoData'' const' ist, nicht die Referenz), aber abgesehen davon, es scheint, wir haben begonnen, die gleiche Antwort gleichzeitig einzugeben Zeit: D aber ich war langsamer, weil ich versucht habe, 'operator >>' auch zu tun ... Ah, und ich würde 'std :: endl' in' operator << 'einfügen, damit ich garantieren konnte, dass ich' lesen kann carName' mit 'std :: readline' in' operator >> '... – Massa

+3

@Massa Ich bin es gewöhnt,' cons & 'zu verwenden, aber vielleicht hast du Recht, wenn ein Anfänger es verwirren könnte.Betreffs 'std :: endl', ich denke, dass es nicht im' operator << 'sein sollte, weil Sie mehrere' AutoData' in derselben Zeile, getrennt durch Koma/Tab, platzieren könnten. Es hängt davon ab, was Sie wirklich brauchen. – Holt

+0

meine Argumentation ist, dass, wenn Sie nicht definieren ein (default?) Terminator für 'AutoData :: carName' und erzwingen es auf' operator << ', dann kann' operator >> 'nicht wissen, wo der Datensatz endet. Deshalb hätte ich mich für die einfachere Option entschieden, den Datensatz mit "endl" zu beenden und "readline" zu verwenden, um die letzte Zeichenfolge zu lesen. Eine andere Option wäre, den Terminator in ein "statisches" Mitglied von "AutoData" zu setzen und mit ihm zu lesen und zu schreiben. – Massa

3

Was haben Sie bisher versucht? Mein Ansatz wäre operator<< werden Überlastung, wie:

std::ostream& operator<<(std::ostream& out, const AutoData& dasAuto) { 
    return out << dasAuto.getmpg() << ':' << dasAuto.getcylinders() << 
    /* insert everthing in the desired order here */ 
    std::endl; 
} 

Und die gleiche Sache für die "Lesen" -Funktion, wie:

std::istream& operator>>(std::istream& in, AutoData& dasAuto) { 
    float mpg; 
    int cylinders; 
    float displacement; 
    float horsepower; 
    float weight; 
    float acceleration; 
    int modelYear; 
    int origin; 
    string carName; 
    char separator; 
    const char SEP = ':'; 

    if(!(in >> mpg >> separator) || (separator != SEP)) return in; 
    if(!(in >> cylinders >> separator) || (separator != SEP)) return in; 
    /* rinse, repeat */ 
    if(!std::getline(in, carName)) return in; 
    dasAuto.setAuto(mpg, cylinders /*, etc etc */); 
    return in; 
} 
+2

Vorsicht, 'auto' ist ein reserviertes Schlüsselwort in C++ 11. – Holt

+0

@Holt - it ist mir in den Sinn gekommen ... es ist 06:30 Uhr, ich war wahrscheinlich im Halbschlaf: D – Massa

0

Sie dieses artical lesen kann über friend und operator <<, wissen http://www.cprogramming.com/tutorial/friends.html In der Klasse AutoData sollten Sie diese Funktion deklarieren:

friend ostream& operator<< (ostream& out, const AutoData& obj); 

außerhalb der Klasse, sollten Sie diese Funktion wie folgt definieren:

ostream& operator<< (ostream& out, const AutoData& obj) 
{ 
    out<<obj.mpg<<":"; 
     //do what you want 
    return out; 
} 
Verwandte Themen