classの宣言と定義と分割コンパイル

10月25日の大事なところ

ツールチップ

宣言や定義の時に、関数や変数の説明を近くにコメントとして書いておくと、実際に変数や関数を使うときに、そのコメントをヒントとして表示してくれます。 自分で設計したものですが、プログラムが大きくなったり、ほかの人と同時に作業を進めるときにはとても重宝しますので、説明のコメントはめんどくさくてもちゃんと書きましょう。


Fig. 1: ツールチップ:変数の型とその説明

Fig. 2: ツールチップ:公開メンバとその説明

Fig. 3: ツールチップ:メンバ関数とその説明

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 <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)
		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 <iostream>
#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を確認