「オブジェクト」の編集履歴(バックアップ)一覧に戻る

オブジェクト - (2018/04/23 (月) 13:28:43) のソース

*クラスの実体
**実体の生成
クラスは型であり、それだけでは実体はありません。
実体を宣言するには以下のように記述します。
 クラス名* 変数名;
この実体の事をオブジェクト、またはインスタンスと呼びます。
1つのクラスに対し複数のオブジェクトを作ることが出来ます。
 Character* karasawa;	// Characterクラスの実体「karasawa」を定義
 Character* slime;	// Characterクラスの実体「slime」を定義

***ポインタを使う理由
(難しいので今は読み飛ばし読み飛ばして、後で戻って見直すことをお勧めします。)
上記の方法だと、オブジェクトはスコープ { } 内でしか生存できません。
スコープが終了するとint型など普通の変数同様そこで破棄されます。
しかしそれでは都合が悪い場合が多く存在します。
そこでオブジェクトのポインタとnewを使いスコープが終了しても生存し続けるオブジェクトを作ることが出来ます。
**オブジェクトの生成
ポインタの確保と定義を別々にする場合。
 Character* karasawa;
 karasawa = new Character("唐沢", 10, 2);
一行で生成する場合
 Character* karasawa = new Character("唐沢", 10, 2);
**オブジェクトの破棄
newしたオブジェクトは明示的に削除しない限りメモリに残り続けます。
&bold(){必要のなくなったオブジェクトは必ずdeleteでを破棄しましょう。}
 delete karasawa;
**オブジェクトの変数へのアクセス
ポインタを使って定義されたオブジェクトは -> (アロー演算子)を使ってアクセスします。
 karasawa->Damage(5);		// 唐沢に5ダメージ
 cout << "HP:" << karasawa->HP << endl;	// 唐沢のHPを表示

*ファイル分けでのクラス作成
では実際にプログラムを書いてみましょう。
基本はクラスごとにファイルを分け、ヘッダーで定義、ソースで実装を記述します。
ファイル名はクラス名と同じにするのが好ましいです。
 /*--------------Character.hの中身----------------*/
 #pragma once
 #include < iostream >
 #include < string >
 
 // キャラクタークラス
 class Character{
 public: // アクセス修飾子
 
 	//【メンバ変数】
 	std::string name;	// 名前
 	int HP;		// 体力
 	int STR;	// 攻撃力
 
 	//【メンバ関数】
 	Character(std::string name, int HP, int STR);	// コンストラクタ
 	~Character();	// デストラクタ
 
 	void Damage(int damage);   // ダメージ関数
 };

 /*--------------Character.cppの中身----------------*/
 #include "Character.h"
 using namespace std;
 
 // コンストラクタ
 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;
 }

 /*--------------main.cppの中身----------------*/
 #include "Character.h"
 
 int main(){
 	using namespace std;
 	// Characterクラスの実体「karasawa」を作成
 	Character* karasawa = new Character("唐沢", 10, 2);
 	
 	karasawa->Damage(5);		// 唐沢に5ダメージ
 	cout << "HP:" << karasawa->HP << endl;	// 唐沢のHPを表示
 
 	delete karasawa;	//「karasawa」を削除
 	
 	return 0;
 }
**問題
第1問
 上記のCharacterクラスに、防御力を表すint型変数 DEF を追加せよ。

第2問
 上記のCharacterクラスのコンストラクタを name, HP, STR, DEF を初期化するように書き換えよ。

第3問
 上記のCharacterクラスに、メンバ変数の値を全て表示する関数 Draw_Status() を追加せよ。
 また、main.cpp でCharacterクラスの実体を1つ作り、Draw_Status() を呼び
 内容を表示せよ
 ※実行例
 名前:唐沢
 HP:10
 STR:2
 DEF:255

第4問
 mainでCharacterクラスの実体を3つ作り、それぞれ Draw_Status() を呼び、内容を表示せよ

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