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