C++ / クラスを自作する

(参考: スラスラわかるC++ 第2版, pp.175-180)

  • データに関する処理は必ず当のクラスが提供することが望ましい。要するに
    インスタンス.函数()という形で処理することが望ましく、
    ×インスタンス.public変数という形でメンバー変数の読み書きができる状態は望ましくない。
  • したがってメンバー変数は全部privateにすることが望ましく、privateな変数を読み書きする必要のある場合は、そのためのpublic函数(いわゆるgetterとsetter)をわざわざ作ることが望ましい。
#include <iostream>
#include <string>
using namespace std;

class QbRate{
    private:
        string Name;
        int Att, Comp, Yds, Td,  Int;
        double Rate;

        double contain(double val); // 値が0~2.375の範囲から出ないようにするための函数。

    public:
        double getRate();
        string getName();
        int getAtt();
        int getComp();
        int getYds();
        int getTd();
        int getInt();

        QbRate(string Name, int Att, int Comp, int Yds, int Td, int Int); // コンストラクター
};


double QbRate::contain(double val){
    return fmax(0.0, fmin(val, 2.375));
}

double QbRate::getRate(){
    double Att  = (double)this->Att;
    double Comp = (double)this->Comp;
    double Yds  = (double)this->Yds;
    double Td   = (double)this->Td;
    double Int  = (double)this->Int;

    double a = contain( (Comp / Att - 0.3) * 5.0 );
    double b = contain( (Yds / Att - 3.0) * 0.25 );
    double c = contain( 20.0 * Td / Att          );
    double d = contain( 2.375 - 25.0 * Int / Att );
    this->Rate = 100.0 * (a + b + c + d) / 6.0;

    this->Rate = round(this->Rate * 10.0) / 10.0;
    return this->Rate;
}

string QbRate::getName(){return this->Name;}
int    QbRate::getAtt() {return this->Att;}
int    QbRate::getComp(){return this->Comp;}
int    QbRate::getYds() {return this->Yds;}
int    QbRate::getTd()  {return this->Td;}
int    QbRate::getInt() {return this->Int;}

QbRate::QbRate(string Name, int Att, int Comp, int Yds, int Td, int Int){ // コンストラクターの実装
    this->Name = Name;
    this->Att  = Att;
    this->Comp = Comp;
    this->Yds  = Yds;
    this->Td   = Td;
    this->Int  = Int;
    this->Rate;
}

int main(){
    QbRate Seahawks("Wilson, Russell", 31, 21, 225, 2, 0);
    //QbRate Seahawks = QbRate(~); // もちろんこう書いてもよいが少し冗長。

    cout << "Name: "          << Seahawks.getName() << endl;
    cout << "Attempts: "      << Seahawks.getAtt()  << endl;
    cout << "Completions: "   << Seahawks.getComp() << endl;
    cout << "Yards: "         << Seahawks.getYds()  << endl;
    cout << "Touchdowns: "    << Seahawks.getTd()   << endl;
    cout << "Interceptions: " << Seahawks.getInt()  << endl;
    cout << "Passer Rating: " << Seahawks.getRate() << endl;

    system("pause");
    return 0;
}

f:id:ti-nspire:20181124043546p:plain
 
 
wolfram:

FormulaData["FootballPasserRating", {"YARDS" -> 225, "ATT" -> 31, "COMP" -> 21, "TD" -> 2, "INT" -> 0}]

f:id:ti-nspire:20181124045509p:plain