11月 1日 クラスの基本まとめ
今日話したことで大事そうなところ
classと、オブジェクトのイメージの話
メンバ関数の作り方(復習)
カプセル化の話
privateにしたメンバ変数をアクセス用メンバ関数で操作する話
全てのメンバ変数をpublicにすると、オブジェクトを抽象化したときになんかおかしいことになるよねって話
コントローラーで、ゲームの中の車を操作するときに、直接スピードや位置を書き換えらえれたら、なんか車の機能として変よね?って話
機能として外から使えるものを考えて、クラス内部と外の橋渡しとしてメンバ関数をつくる(図1:参照)
コンストラクタは、引数ありのものを作ることができる
クラス型のメンバ変数を含むクラス(他のクラスがメンバとして存在するクラス(図2:参照)
プロジェクトにclassを追加するときにちょっと楽な方法
Fig. 1: ゲームの中の車の抽象化とクラス、および、メンバ関数による操作
Fig. 2: 2キャラクタの距離
ccar.h
#pragma once
class cCar
{
private:
//メンバ変数
//ボディーサイズ?
float m_body;
//タイヤの耐久度(すり減り具合)
int m_tire;
//エンジンがかかっているかどうか
//true:エンジンON false:エンジンOFF
bool m_engine;
//スピード
float m_speed;
//向いている方向 -1:左 0:前 1:右
int m_direction;
public:
//メンバ関数
//コンストラクタ
//constructor : メンバ変数の初期化をする
//特別なメンバ関数
cCar();
//エンジンがかかっていなかったらエンジンON
//戻り値 なし
//引数 なし
void ignition();
//float doMove();//走る
//エンジンがかかっていたら、スピードを10キロあげる
void doAccel();//アクセル踏む
//エンジンがかかっていたらかつ、車が動いていたら、
//スピードを10キロ下げる(最小値0)
void doBreak();//ブレーキ踏む
//上の二つを実装して、mainから呼んでstatusを確認
//戻り値 なし
//第1引数 int _direction -1:左 0:まっすぐ 1:右
void doTurn(int _direction);//曲がる
//子の変数の実装を書いてみよう!
//エンジンがかかっていたらエンジンをストップする
//戻り値 なし
//引数 なし
void doStop();//エンジン止まる
//セッター(setter):メンバ変数の値をセットするメンバ関数
//ゲッター(getter):メンバ変数の値をゲットするメンバ関数
//を作る
void setTireTiredness(int _tire);//setter
int getTireTiredness();//getter
//現在の車の状態を表示するメンバ関数
//戻り値 なし
//引数 なし
void printCarStatus();
};//←宣言はセミコロンで終わるよ
ccar.cpp
#include "ccar.h"
#include <iostream>
#include <string>
cCar::cCar()
{
//ボディーサイズ? メートル?
m_body = 2.5;
//タイヤの耐久度(すり減り具合)パーセント?
m_tire = 100;
//エンジンがかかっているかどうか
//true:エンジンON false:エンジンOFF
m_engine = false;
m_speed = 0.0;//スピード
m_direction = 0; //前
}
void cCar::ignition()
{
//エンジンをかける(エンジンがかかってなかったら)
if (m_engine == false)
m_engine = true;
else
std::cout << "Engine : Already Running" << std::endl;
}
void cCar::doStop()
{
//エンジンを止める(かかっていたら)
if (m_engine == true)
if (m_speed == 0) {
m_engine = false;
}
else
{
std::cout << "Engine : The Engine will not Stop While Driving!!" << std::endl;
}
else
std::cout << "Engine : Not Running" << std::endl;
}
void cCar::doAccel()
{
if (m_engine == true)
{
m_speed = m_speed + 10.0;//10km/h スピードUP
}
//max180km/hでリミッターかけてみよう
}
void cCar::doBreak()
{
if (m_engine == true && m_speed > 0.0)
{
m_speed = m_speed - 10.0;//10km/h スピードDOWN
if (m_speed < 0.0) m_speed = 0.0;
}
}
void cCar::setTireTiredness(int _tire)
{
m_tire = _tire;
}
int cCar::getTireTiredness()
{
return(m_tire);
}
void cCar::doTurn(int _direction)
{
m_direction = _direction;
}
void cCar::printCarStatus()
{
std::cout << "-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+" << std::endl;
std::cout << "Body Size : "
<< m_body << "m" << std::endl;
std::cout << "Tire : " << m_tire
<< " % " << std::endl;
if (m_engine)
std::cout << "Engine : Running" << std::endl;
else
std::cout << "Engine : Stopped" << std::endl;
std::cout << "Speed : " << m_speed
<< " km/h " << std::endl;
std::cout << "Direction : ";
switch (m_direction)
{
case -1:
std::cout << "Left" << std::endl;
break;
case 0:
std::cout << "Forward" << std::endl;
break;
case 1:
std::cout << "Right" << std::endl;
break;
defaut:
std::cout << "Forward" << std::endl;
break;
}
std::cout << "-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+" << std::endl;
}
theMain.cpp
#include <iostream>
#include "ccar.h"
int main()
{
cCar mycar;//mycarはcCarクラスのインスタンス!
//m_engineはprivateなのでアクセスできない!!
//mycar.m_engine = true;
mycar.ignition();
mycar.printCarStatus();
//ccar.cに void doStop();の実装を書き
//mainで実際に呼び出し、エンジンをストップさせ
//現在の車の状況を出力する
mycar.doAccel(); //アクセルを踏む関数(+10km/h)
mycar.doAccel();
mycar.printCarStatus();//現在の車の情報を表示
mycar.doBreak();//ブレーキを踏む(-10km/h)
mycar.doBreak();
mycar.printCarStatus();//現在の車の情報を表示
mycar.setTireTiredness(50);//タイヤの耐久度をセット
int t = mycar.getTireTiredness();//タイヤの耐久度を取得
std::cout << t << std::endl;//タイヤの耐久度を表示
mycar.doAccel();
mycar.doStop();//エンジンをストップ
mycar.printCarStatus();//現在の車の情報を表示
//停止状態(speed==0)の時しかエンジンをストップ
//出来ないようにしてみよう
//走ってるときにエンジンを切ろうとしたら、警告を表示!
//25分まで!
mycar.doTurn(-1);
mycar.printCarStatus();
return 0;
}