|
今回は といってもいまいち何を言っているのかピンと来ないと思います オブジェクトというのは構造体やクラスの変数のことで Obj obj1,obj2; obj1 = obj2; これはobj2のデータ(メモリ)をそのままobj1にコピーするということです さて、C++では基本クラスのオブジェクトに #include <iostream>
using namespace std;
class Parent
{
public:
void Show()
{
cout << "親クラスShow" << endl;
}
};
class Child: public Parent
{
public:
// オーバーライド
void Show()
{
cout << "子クラスShow、オーバーライド" << endl;
}
};
// main関数(クラスの外部)
int main()
{
Parent pt;
Child ch;
pt = ch;
pt.Show();
return 0;
}
ここで注目してほしいのは #include <iostream>
using namespace std;
class Parent
{
public:
virtual void Show()
{
cout << "親クラスShow" << endl;
}
};
class Child: public Parent
{
public:
// オーバーライド
void Show()
{
cout << "子クラスShow、オーバーライド" << endl;
}
};
// main関数(クラスの外部)
int main()
{
Parent* pt;
Child ch;
pt = &ch;
pt->Show();
return 0;
}
Parent型(基本クラス)のポインタを用意し、 これだけでは、「何これ?おいしいの?」状態です この例では、キャラクターに職業を持たせ #define _CRT_SECURE_NO_WARNINGS
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
using namespace std;
//プレイヤーデータ
struct PLAYERDATA
{
char name[256];
char jobname[256];
int Level;
int HP;
int MP;
int power;
int speed;
int inteligence;
};
//ジョブデータ
struct JOBDATA
{
char jobname[256];
float HP;
float MP;
float power;
float speed;
float inteligence;
};
class Person
{
protected:
PLAYERDATA status;
PLAYERDATA base;
public:
Person(){}
Person(PLAYERDATA pd):base(pd)
{
strcpy(status.name,base.name);
}
virtual ~Person(){}
void ShowStatus()
{
cout << "Name = " << status.name << endl;
cout << "Job = " << status.jobname << endl;
cout << "Level = " << status.Level << endl;
cout << "HP = " << status.HP << endl;
cout << "MP = " << status.MP << endl;
cout << "power = " << status.power << endl;
cout << "speed = " << status.speed << endl;
cout << "inteligence = " << status.inteligence << endl;
}
void LevelUP()
{
srand((unsigned int)time(NULL));
base.Level++;
base.HP += rand() % 20;
base.MP += rand() % 10;
base.power += rand() % 7;
base.speed += rand() % 5;
base.inteligence += rand() % 6;
cout << "Level UP !!" << endl;
UpDateStatus();
}
virtual void UpDateStatus() = 0;
};
class Knight : public Person
{
private:
JOBDATA jobknight;
public:
Knight(PLAYERDATA pd,JOBDATA jd):Person(pd),jobknight(jd)
{
UpDateStatus();
}
virtual ~Knight()
{
}
virtual void UpDateStatus()
{
strcpy(status.jobname,jobknight.jobname);
status.Level = base.Level;
status.HP = static_cast<int>(base.HP * jobknight.HP);
status.MP = static_cast<int>(base.MP * jobknight.MP);
status.power = static_cast<int>(base.power * jobknight.power);
status.speed = static_cast<int>(base.speed * jobknight.speed);
status.inteligence = static_cast<int>(base.inteligence * jobknight.inteligence);
}
};
class Magician : public Person
{
private:
JOBDATA jobmagician;
public:
Magician(PLAYERDATA pd,JOBDATA jd):Person(pd),jobmagician(jd)
{
UpDateStatus();
}
virtual ~Magician()
{
}
virtual void UpDateStatus()
{
strcpy(status.jobname,jobmagician.jobname);
status.Level = base.Level;
status.HP = static_cast<int>(base.HP * jobmagician.HP);
status.MP = static_cast<int>(base.MP * jobmagician.MP);
status.power = static_cast<int>(base.power * jobmagician.power);
status.speed = static_cast<int>(base.speed * jobmagician.speed);
status.inteligence = static_cast<int>(base.inteligence * jobmagician.inteligence);
}
};
int main()
{
PLAYERDATA playerdata;
JOBDATA knight ,magician ;
// 外部データ(本当はファイル読み込みが望ましい)
strcpy(playerdata.name,"player");
playerdata.Level = 1;
playerdata.HP = 100;
playerdata.MP = 80;
playerdata.power = 50;
playerdata.speed = 30;
playerdata.inteligence = 50;
strcpy(knight.jobname,"knight");
knight.HP = 1.4f;
knight.MP = 0.4f;
knight.power = 1.2f;
knight.speed = 1.2f;
knight.inteligence = 0.3f;
strcpy(magician.jobname,"magician");
magician.HP = 0.8f;
magician.MP = 2.0f;
magician.power = 0.3f;
magician.speed = 0.8f;
magician.inteligence = 1.5f;
// ポリモーフィズム
Person *player;
Knight knightplayer(playerdata,knight );
Magician magicianplayer(playerdata,magician );
player = &knightplayer;
player->ShowStatus();
cout << endl;
player->LevelUP();
cout << endl;
player->ShowStatus();
cout << endl;
cout << "Job Change !!" << endl;
cout << endl;
player = &magicianplayer;
player->ShowStatus();
return 0;
}
いくつか説明してない箇所があります Person pd; Person pd = new Person(); などとやって変数用メモリを用意することです Person *player; もうひとつ説明してないのは static_cast<int>(なんとか) という部分です、これはただ単にint型にキャストしているだけです (int)(なんとか) とキャストしても同じです このように基本クラスのポインタに継承クラスのオブジェクトをとっかえひっかえして この講座を通して
まだだ、まだ終わらんよ! vote((^ω^)わかったお[7],普通[0],。(`ω´#)。わかりにくぃぜぇえええええ[0]) |