web-dev-qa-db-fra.com

Fonction d'impression pour la classe c ++

Je veux écrire une fonction d'impression pour une classe AutoData contenant des informations sur les voitures. Avec cette fonction d'impression, j'aimerais idéalement imprimer un vecteur contenant de nombreux objets de classe différents. J'ai déjà écrit les fonctions get pour chaque élément des objets, mais je ne sais toujours pas comment utiliser ces fonctions pour écrire une fonction permettant d'imprimer les données au format suivant:

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

Par exemple:

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

Le cours est:

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

Toute aide/conseil que quiconque pourrait fournir serait très apprécié !! Merci

9
Pseudo Sudo

Si vous voulez pouvoir exécuter std::cout << AutoData();, vous devez surcharger l'opérateur de flux de sortie operator<<:

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

Cette fonction n'est pas une fonction membre et, comme vous avez des getters pour chaque attribut, vous n'avez pas à déclarer cette fonction en tant que friend de votre classe.

Ensuite, vous pouvez faire:

AutoData myAuto;
std::cout << myAuto << '\n';
9
Holt

Qu'avez-vous essayé jusqu'à présent? Mon approche surchargerait operator<<, comme ceci:

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

Et la même chose pour la fonction "lecture", comme:

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

Vous pouvez lire cet article pour en savoir plus sur friend et operator <<, http://www.cprogramming.com/tutorial/friends.html

Dans la classe AutoData, vous devez déclarer cette fonction:

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

en dehors de la classe, vous devriez définir cette fonction comme ceci:

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