web-dev-qa-db-ja.com

クラスc ++の印刷関数

自動車に関する情報を含むAutoDataクラスの印刷関数を記述したいと思います。この印刷機能を使用して、多くの異なるクラスオブジェクトを含むベクターを印刷するのが理想的です。オブジェクトの各要素に対してget関数を既に作成しましたが、それらを使用して次の形式でデータを出力する関数を作成する方法についてはまだわかりません。

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

例えば:

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

クラスは次のとおりです。

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

誰でも提供できるどんな助け/アドバイスでも大歓迎です!!ありがとう

12
Pseudo Sudo

std::cout << AutoData();を実行できるようにするには、出力ストリーム演算子operator<<をオーバーロードする必要があります。

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

この関数はメンバー関数ではなく、属性ごとにゲッターがあるため、この関数をクラスのfriendとして宣言する必要はありません。

その後、次のことができます。

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

これまでに何を試しましたか?私のアプローチは過負荷になるでしょうoperator<<、 お気に入り:

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

そして、 "reading"関数についても同様です。

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

friendoperator <<について知るには、この記事を読むことができます http://www.cprogramming.com/tutorial/friends.html

クラスAutoDataでは、この関数を宣言する必要があります。

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

クラスの外では、この関数を次のように定義する必要があります。

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