「オーバーロード」の編集履歴(バックアップ)一覧に戻る

オーバーロード - (2017/12/01 (金) 17:13:57) のソース

*オーバーロード
**オーバーロード
同じ名前の関数を複数定義し、
引数のとり方により、振る舞いを変えることをオーバーロードといいます。

同じ名前の関数でも、引数の 型 個数 を変えて複数実装を書くことができます。
 /*--------------Character.hの中身----------------*/
 #include < iostream >
 using namespace std;
 // キャラクタークラス
 class Character{
 private:
 	//【メンバ変数】
 	string name;	// 名前
 	int HP;		// 体力
 	int STR;	// 攻撃力
 
 public:
 	//【メンバ関数】
 	Character(string name, int HP, int STR);	// コンストラクタ
 	~Character();	// デストラクタ
 
 	// ダメージ関数(オーバーロード:ダメージ数のみ得る)
 	void Damage(int damage);
 	// ダメージ関数(オーバーロード:誰が攻撃したかも得る)
 	void Damage(int damage, string attacker);
 
 	void Draw_Status();		// ステータス表示
 
 	//【ゲッター】
 	string GetName();
 	int GetSTR();
 };

 /*--------------Character.cppの中身----------------*/
 #include "Character.h"
 
 // コンストラクタ
 Character::Character(string name, int HP, int STR){
 	this->name = name;
 	this->HP = HP;
 	this->STR = STR;
 }
 // デストラクタ
 Character::~Character(){
 	// 何もしない
 }
 // ダメージ関数(オーバーロード:ダメージ数のみ得る)
 void Character::Damage(int damage){
 	this->HP -= damage;
 	cout << name << "は" << damage << "のダメージをうけた" << endl;
 }
 // ダメージ関数(オーバーロード:誰が攻撃したかも得る)
 void Character::Damage(int damage, string attacker){
 	this->HP -= damage;
 	cout << attaker << "の攻撃" << endl;
 	cout << name << "は" << damage << "のダメージをうけた" << endl;
 }
 // ステータス表示
 int Character::Draw_Status(){
 	cout << "name:" << name << endl;
 	cout << "HP  :" << HP << endl;
 	cout << "STR :" << STR << endl;
 }
 //【ゲッター】
 string GetName(){
 	return name;
 }
 string GetSTR(){
 	return STR;
 }

 int main(){
 	
 	// Characterクラスの実体「karasawa」を作成
 	Character* karasawa = new Character("唐沢", 10, 2);
 	// Characterクラスの実体「slime」を作成
 	Character* slime = new Character("スライム", 3, 1);
  
 	// 唐沢にダメージ(ダメージ数のみ)
 	karasawa->Damage(5);
 	karasawa->Draw_Status();// ステータス表示
 
 	// 唐沢がスライムに攻撃(ダメージ数と攻撃者の名前)
 	slime->Damage(karasawa->GetSTR, karasawa->GetName);
 	slime->Draw_Status();// ステータス表示
 
 	delete karasawa;	//「karasawa」を削除
 	delete slime;		//「slime」を削除
 	
 	return 0;
 }

コンストラクタをオーバーロードすることもできます。
 /*--------------Character.hの中身----------------*/
 #include < iostream >
 using namespace std;
 // キャラクタークラス
 class Character{
 private:
 	//【メンバ変数】
 	string name;	// 名前
 	int HP;		// 体力
 	int STR;	// 攻撃力
 
 public:
 	//【メンバ関数】
 	Character(string name, int HP, int STR);	// コンストラクタ
 	Character(string name);		// コンストラクタ(オーバーロード:名前だけ得る)
 	~Character();	// デストラクタ
 
 	// ダメージ関数(オーバーロード:ダメージ数のみ得る)
 	void Damage(int damage);
 	// ダメージ関数(オーバーロード:誰が攻撃したかも得る)
 	void Damage(int damage, string attacker);
 
 	void Draw_Status();		// ステータス表示
 
 	//【ゲッター】
 	string GetName();
 	int GetSTR();
 };

 /*--------------Character.cppの中身----------------*/
 #include "Character.h"
 
 // コンストラクタ
 Character::Character(string name, int HP, int STR){
 	this->name = name;
 	this->HP = HP;
 	this->STR = STR;
 }
  // コンストラクタ(名前だけ得る)
 Character::Character(string name){
 	this->name = name;
 	this->HP = 1;
 	this->STR = 1;
 }
 // デストラクタ
 Character::~Character(){
 	// 何もしない
 }
 /*
 	以下略
 */

 int main(){
 	
 	// Characterクラスの実体「karasawa」を作成
 	Character* karasawa = new Character("唐沢", 10, 2);
 	// Characterクラスの実体「slime」を作成(名前だけを指定)
 	Character* karasawa = new Character("スライム");
  
 	// ステータス表示
 	karasawa->Draw_Status();
 	slime->Draw_Status();
 
 	delete karasawa;	//「karasawa」を削除
 	delete slime;		//「slime」を削除
 	
 	return 0;
 }

**デフォルト引数
デフォルト引数とは、引数に初期値を設定して、
関数呼び出し時に引数を省略できるようにするものです。

例
 /*--------------Character.hの中身----------------*/
 #include < iostream >
 using namespace std;
 // キャラクタークラス
 class Character{
 private:
 	//【メンバ変数】
 	string name;	// 名前
 	int HP;		// 体力
 	int STR;	// 攻撃力
 
 public:
 	//【メンバ関数】
 	// コンストラクタ(デフォルト引数あり)
 	Character(string name, int HP = 1, int STR = 1);
 	~Character();	// デストラクタ
 
 	// ダメージ関数(オーバーロード:ダメージ数のみ得る)
 	void Damage(int damage);
 	// ダメージ関数(オーバーロード:誰が攻撃したかも得る)
 	void Damage(int damage, string attacker);

 	void Draw_Status();		// ステータス表示
 
 	//【ゲッター】
 	string GetName();
 	int GetSTR();
 };

 /*--------------Character.cppの中身----------------*/
 #include "Character.h"
 
 // コンストラクタ(cppの方にはデフォルト引数の値を書かない)
 Character::Character(string name, int HP, int STR){
 	this->name = name;
 	this->HP = HP;
 	this->STR = STR;
 }
 // デストラクタ
 Character::~Character(){
 	// 何もしない
 }
 /*
 	以下略
 */

 int main(){
 	
 	// Characterクラスの実体「karasawa」を作成
 	Character* karasawa = new Character("唐沢", 10, 2);
 	// Characterクラスの実体「slime」を作成(HPとSTRを省略)
 	Character* karasawa = new Character("スライム");
 	// Character* karasawa = new Character("スライム", 1, 1); と書いたのと同じ結果になる
 	// Character* karasawa = new Character("スライム", 1); とSTRだけ省略することもできる
  
 	// ステータス表示
 	karasawa->Draw_Status();
 	slime->Draw_Status();
 
 	delete karasawa;	//「karasawa」を削除
 	delete slime;		//「slime」を削除
 	
 	return 0;
 }

***使用上の注意
デフォルト引数にしていできるのは末端の引数です。
 Character(string name, int HP = 1, int STR = 1); 	// OK
 Character(string name, int HP = 1, int STR); 		// だめ

**問題
 第2問
コンソール上に 指定した文字 で 指定した大木さ の四角形を描くプログラムを作成せよ。
関数にはオーバーロードを用いて以下のような形式で指定できるようにすること。

 //*で正方形を描く
 drawRect(int side);
 //*で長方形を描く
 drawRect(int width, int height);
 //指定した文字で正方形を描く
 drawRect(int side, char c);
 //指定した文字で長方形を描く
 drawRect(int width, int height, char c);

このクラスはメンバ変数を持つ必要がない
また、関数にstaticをつけると静的関数として
オブジェクトを作らなくても、クラス名::関数名 で直接クラスから実行できる。
静的関数だけを持つクラスを「ユーティリティークラス」という。

 第3問
問題2のプログラムはデフォルト引数を使えば短く書くことができる。
書き直してみよう。

testcounter
合計 &counter(total)
今日 &counter(today)
昨日 &counter(yesterday)
目安箱バナー