2014-04-23 15 views
6

Chcę napisać funkcję drukowania dla klasy AutoData, która zawiera informacje o samochodach w niej zawartych. Przy tej funkcji drukowania najlepiej byłoby wydrukować wektor zawierający wiele różnych obiektów klasy. Pisałem już funkcje dostać do każdego elementu przedmiotów, ale nadal jestem trochę niepewny, jak go o użyciu tych napisać funkcję, aby wydrukować dane w następującym formacie:Funkcja drukowania dla klasy C++

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

Na przykład :

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 

Klasa jest:

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

Każda pomoc/wskazówki ktoś może dostarczyć byłby bardzo cenione !! Dzięki

+0

jeśli chcesz drukować do konsoli tylko cout << mpg << ":" << << "cylindry" etc - jeśli chcesz przechowywać w ciągu znaków, użyj strumienia stringów. – Mike

+0

, ale w jaki sposób wydrukować cały ich wektor? tak, że jego mpg1: cylinders1: etc ... mpg2: cylinders2: etc ... –

+0

Wystarczy iterować nad wektorem i dodać znaki nowej linii między pozycjami – stefaanv

Odpowiedz

7

I chcesz być w stanie zrobić std::cout << AutoData();, należy przeciążać operatora strumień wyjściowy operator<<:

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

Ta funkcja nie jest funkcją członkiem, a skoro masz pobierające dla każdego atrybutu, ty nie musisz deklarować tej funkcji jako friend swojej klasy.

Następnie można zrobić:

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

Uważam, że notacja 'const & 'jest bardzo myląca (odwraca uwagę od faktu, że jest to podstawowa" AutoData ", która jest" const ", a nie referencją), ale poza tym, wydaje się, że zaczęliśmy pisać tę samą odpowiedź w tym samym czas: D ale byłem wolniejszy, ponieważ próbowałem zrobić 'operator >>' też ... Ah, i wstawiłbym 'std :: endl' w' operator << ', więc mogłem zagwarantować, że mogę przeczytać' carName' z 'std :: readline' w' operator >> '... – Massa

+3

@Massa Używam' cons & ', ale może masz rację dla początkującego, może to być mylące.Odnośnie 'std :: endl', myślę, że nie powinno to być w' operator << ', ponieważ możesz chcieć umieścić wiele' AutoData' w tej samej linii, oddzielonych koma/tab. To zależy od tego, czego naprawdę potrzebujesz. – Holt

+0

rozumuję w ten sposób, że jeśli nie zdefiniujesz terminatora (domyślnie?) Dla 'AutoData :: carName' i wymusisz na' operator << ', wówczas' operator >> 'nie będzie wiedział, gdzie kończy się rekord. Dlatego też zdecydowałbym się na prostszą opcję zakończenia zapisu z 'endl' i użycia' readline' do przeczytania końcowego ciągu. Inną opcją byłoby umieszczenie terminatora w "statycznym" elemencie 'AutoData' oraz dopasowywanie odczytów i zapisów z jego użyciem .... – Massa

3

Co próbowałeś do tej pory? Moje podejście byłoby przeciążenia operator<<, jak:

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

i to samo dla funkcji "odczyt", takich jak:

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

Uważaj,' auto' jest zastrzeżonym słowem kluczowym w C++ 11. – Holt

+0

@Holt - it umknęło mi w głowie ... jest 06:30 tutaj, prawdopodobnie byłem w półśnie: D – Massa

0

Można przeczytać ten artical wiedzieć o friend i operator <<, http://www.cprogramming.com/tutorial/friends.html

W klasie AutoData należy zadeklarować tę funkcję:

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

poza klasą, należy zdefiniować tę funkcję tak:

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