[C++]4.2クラス-レプリケーション作成者

5006 ワード

咀嚼C++学習講座のノート.

new Class, delete Class[n]


ユーツゲーム、才気蹴り、花図など韓国の伝統民俗ゲームのスターウォーズ1のマリンをC++で体現しましょう.
#include <iostream>

class Marine {
	int hp;						// 마린 체력
	int coord_x, coord_y;		// 마린 위치
	int damage;					// 공격력
	int is_dead;			

public:
	Marine();					// 기본 생성자
	Marine(int x, int y);		// x, y 좌표에 마린 생성

	int attack();				// x, y 좌표에 마린 생성
	void be_attacked(int damage_earn);	//입는 데미지
	void move(int x, int y);	// 새로운 위치

	void show_status();			// 상태 띄우기
};
Marine::Marine(){
	hp = 50;
	coord_x = coord_y = 0;
	damage = 5;
	is_dead = false;
}
Marine::Marine(int x, int y){
	coord_x = x;
	coord_y = y;
	hp = 50;
	damage = 5;
	is_dead = false;
}
void Marine::move(int x, int y){
	coord_x = x;
	coord_y = y;
}
int Marine::attack(){
	return damage;
}
void Marine::be_attacked(int damage_earn){
	hp -= damage_earn;
}
void Marine::show_status(){
	std::cout << "** Marine **" << std::endl;
	std::cout << " Loacation : ( " << coord_x << ", " << coord_y << ")" << std::endl;
	std::cout << " HP : " << hp << std::endl;
}

int main(){
	Marine marine1(2,3);
	Marine marine2(3,5);

	marine1.show_status();
	marine2.show_status();

	std::cout << std::endl << "마린 1 이 마린 2 를 공격!" << std::endl;
	marine2.be_attacked(marine1.attack());

	marine1.show_status();
	marine2.show_status();
}
  • マーリン1はマーリン2を攻撃するコード.
  • そんなやり方でマリンを一つ一つ作るのは難しい.ではnewでやりましょう.
    int main(){
    	Marine * marine[100];
    
    	marine[0] = new Marine(2,3);
    	marine[1] = new Marine(3,5);
    
    	marine[0]->show_status();
    	marine[1]->show_status();
    
    	std::cout << std::endl << "마린 1 이 마린 2 를 공격" << std::endl;
    	marine[1]->be_attacked(marine[0]->attack());
    
    	marine[0]->show_status();
    	marine[1]->show_status();
        
        delete marine[0];
    	delete marine[1];
    }
  • 結果は同じ
  • newはmallocにメモリを割り当てているようですが、少し違います
  • クラスジェネレータ.
  • CとC++の最大の違い.
  • しました
  • new、必ず削除してください.
  • 消滅者


    マーリンに名前をつけて、コンパイルしてください.
    class Marine {
    	int hp;						// 마린 체력
    	int coord_x, coord_y;		// 마린 위치
    	int damage;					// 공격력
    	char * name;				// 이름
    	int is_dead;			
    
    public:
    	Marine();					// 기본 생성자
    	Marine(int x, int y);		// x, y 좌표에 마린 생성
    	Marine(int x, int y, const char* marine_name);		// x, y 좌표에 이름을 가진 마린 생성
    
    	int attack();				// x, y 좌표에 마린 생성
    	void be_attacked(int damage_earn);	//입는 데미지
    	void move(int x, int y);	// 새로운 위치
    
    	void show_status();			// 상태 띄우기
    };
    Marine::Marine(){
    	hp = 50;
    	coord_x = coord_y = 0;
    	damage = 5;
    	name = NULL;
    	is_dead = false;
    }
    Marine::Marine(int x, int y){
    	coord_x = x;
    	coord_y = y;
    	hp = 50;
    	damage = 5;
    	name = NULL;
    	is_dead = false;
    }
    Marine::Marine(int x, int y, const char* name){
    	coord_x = x;
    	coord_y = y;
    	hp = 50;
    	damage = 5;
    	name = new char[strlen(name) +1];
    	is_dead = false;
    }
    
    ...
    
  • 結果は良かった.
  • name = new char[strlen(name) +1];
    ただしクラス内にメモリが付与された後は削除されていないコードが使用される.
  • メモリリークの問題が発生.
  • C++このような事態を防ぐため、「消滅者」(Destructor)をサポートする.
  • 消滅者を使う.
    class Marine {
    	int hp;						// 마린 체력
    	int coord_x, coord_y;		// 마린 위치
    	int damage;					// 공격력
    	char * name;				// 이름
    	int is_dead;			
    
    public:
    	Marine();					// 기본 생성자
    	Marine(int x, int y);		// x, y 좌표에 마린 생성
    	Marine(int x, int y, const char* marine_name);		// x, y 좌표에 이름을 가진 마린 생성
    	~Marine();					// 소멸자
    
    	int attack();				// x, y 좌표에 마린 생성
    	void be_attacked(int damage_earn);	//입는 데미지
    	void move(int x, int y);	// 새로운 위치
    
    	void show_status();			// 상태 띄우기
    };
    Marine::Marine(){
    	hp = 50;
    	coord_x = coord_y = 0;
    	damage = 5;
    	name = NULL;
    	is_dead = false;
    }
    Marine::Marine(int x, int y){
    	coord_x = x;
    	coord_y = y;
    	hp = 50;
    	damage = 5;
    	name = NULL;
    	is_dead = false;
    }
    Marine::Marine(int x, int y, const char* marine_name){
    	coord_x = x;
    	coord_y = y;
    	hp = 50;
    	damage = 5;
    	name = new char[strlen(marine_name) +1];
    	strcpy(name, marine_name);
    	is_dead = false;
    }
    Marine::~Marine() {
      std::cout << name << " 의 소멸자 호출 ! " << std::endl;
      if (name != NULL) {
        delete[] name;
      }
    }

    使用
  • 消滅者確認結果、クラス削除時に自動的に消滅者が呼び出されることを確認できます.
  • deleteが消滅者のクラス(メモリを追加したクラス)を使用して消滅しなければならない場合は、上のdeleteクラス[n]を使用してどのクラスを削除するかを指定する必要があります.
  • 消滅を必要としない者は使わなくてもいいし、Default消滅者もいる.