====== classの宣言と定義と分割コンパイル ======
===== 10月25日の大事なところ =====
* publicとprivate
* メンバ変数には区別がつきやすいようにmを付けた名前を付ける
* public:に書かなかった変数は基本的にprivateになる
* privateはクラス定義以外からは見えない(基本的に)
* メンバ関数定義を書くときは、classに所属しているという意味で
* 戻り値 クラス名::メンバ関数名(引数リスト){なかみ}とかく
* 分割コンパイルのファイルの分け方
* コンストラクタ(constructor)は、クラスと同じ名前の特殊な関数
* コンストラクタは戻り値がなく、クラスの実体(クラス型の変数)が作られるときに自動的に呼ばれる
* コンストラクタには、メンバ変数の初期化を書き連ねる
* .hファイルの#pragma onceは消さない!
===== ツールチップ =====
宣言や定義の時に、関数や変数の説明を近くにコメントとして書いておくと、実際に変数や関数を使うときに、そのコメントをヒントとして表示してくれます。
自分で設計したものですが、プログラムが大きくなったり、ほかの人と同時に作業を進めるときにはとても重宝しますので、説明のコメントはめんどくさくてもちゃんと書きましょう。
{{:game-engineer:classes:game-programing-1:toolchip1.png?300|}}\\
ツールチップ:変数の型とその説明
{{:game-engineer:classes:game-programing-1:toolchip2.png?300|}}\\
ツールチップ:公開メンバとその説明
{{:game-engineer:classes:game-programing-1:toolchip3.png?300|}}\\
ツールチップ:メンバ関数とその説明
=== ccar.h ===
#pragma once
class cCar
{
//メンバ変数
float m_body; //ボディーサイズ?
int m_tire; //タイヤの耐久度(すり減り具合)
bool m_engine;//エンジンがかかっているかどうか
float m_speed;//スピード
int m_direction;//向いている方向 0:左 1:右
public:
//メンバ関数
//エンジンがかかっていたら、スピードを10キロあげる
float doMove();//走る
void doTurn(int _direction);//曲がる
void doStop();//止まる
void printCarStatus();
};//←宣言はセミコロンで終わるよ
=== ccar.cpp ===
==== void cCar::printCarStatus() ====
void cCar::printCarStatus()
{
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/s " << 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;
}
}
====== とりあえず今日の最後のソースコード ======
=== 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を確認
void doTurn(int _direction);//曲がる
//エンジンがかかっていたらエンジンをストップする
//戻り値 なし
//引数 なし
void doStop();//エンジン止まる
//現在の車の状態を表示するメンバ関数
//戻り値 なし
//引数 なし
void printCarStatus();
};//←宣言はセミコロンで終わるよ
=== ccar.cpp ===
#include "ccar.h"
#include
#include
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)
m_engine = false;
else
std::cout << "Engine : Not Running" << std::endl;
}
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/s " << 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
#include "ccar.h"
int main()
{
cCar mycar;
//m_engineはprivateなのでアクセスできない!!
//mycar.m_engine = true;
mycar.ignition();
mycar.printCarStatus();
//ccar.cに void doStop();の実装を書き
//mainで実際に呼び出し、エンジンをストップさせ
//現在の車の状況を出力する
mycar.doStop();
mycar.printCarStatus();
return 0;
}
==== 課題演習 ====
//エンジンがかかっていたら、スピードを10キロあげる\\
void doAccel();//アクセル踏む\\
//エンジンがかかっていたらかつ、車が動いていたら、\\
//スピードを10キロ下げる(最小値0)\\
void doBreak();//ブレーキ踏む\\
//上の二つを実装して、mainから呼んでstatusを確認\\