質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1023閲覧

派生クラスの扱い方について

nigg_1513

総合スコア16

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/04/17 13:52

###実現したいこと
プログラム練習として、RPG的なものを作成しています。
攻撃を行い、その値を反映させたいです。
しかし、攻撃値が最終的な体力の値に反映されません。

多くのプログラミングを掲載して申し訳ございません

発生している問題

実行結果

らすぼす に 50 のダメージをあたえた らすぼす の たいりょくは 450 になった -らすぼす の ステータス--- たいりょく : 500

###関連するコード

Human

1class Human 2{ 3public: 4 Human(); 5 ~Human(); 6 7 //Setter/Getter 8 std::string GetName(); 9 void SetName(std::string _name); 10 int GetVitality(); 11 void SetVitality(int _vitality); 12private: 13 std::string name; 14 int vitality; 15}; 16 17std::string Human::GetName() { 18 return this->name; 19} 20void Human::SetName(std::string _name) { 21 this->name = _name; 22} 23 24int Human::GetVitality() { 25 return this->vitality; 26} 27void Human::SetVitality(int _vitality) { 28 this->vitality = _vitality; 29}

Yuusya

1class Yuusya : public Human 2{ 3public: 4 Yuusya(); 5 ~Yuusya(); 6 7 void SpecialAttack(Human target); 8}; 9 10Yuusya::Yuusya(){ 11///勇者ステータス 12} 13Yuusya::~Yuusya(){} 14 15void Yuusya::SpecialAttack(Human target) { 16 target.SetVitality(target.GetVitality() - 50); 17 std::cout << target.GetName() << "に 50 のダメージを あたえた" << std::endl; 18 std::cout << "らすぼす の たいりょくは " << target.GetVitality() << " になった" << std::endl; 19}

LastBoss

1 2class LastBoss : public Human 3{ 4public: 5 LastBoss(); 6 ~LastBoss(); 7}; 8 9LastBoss::LastBoss(){ 10 SetName("らすぼす"); 11 SetVitality(500); 12} 13LastBoss::~LastBoss(){}

main

1void Showstatus(Human target); 2 3int main(){ 4 Human human; 5 Yuusya yuusya; 6 LastBoss lastBoss; 7 8 yuusya.SpecialAttack(lastBoss); 9 10 Showstatus(lastBoss); 11 12 return 0; 13} 14 15void Showstatus(Human target) { 16 std::cout << "- " << target.GetName() << " の ステータス---" << std::endl; 17 std::cout << "たいりょく : " << target.GetVitality() << std::endl; 18} 19

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

こんにちは。

void Yuusya::SpecialAttack(Human target)

この受け取り方は、呼び出し側で渡したlastBossをHuman型のインスタンスtagetへコピーしています。
そのコピーされた値をいくら変更しても、呼び出し元のlastBossには反映されません。

&を付け加えて参照で受け取るといけるだろうと思います。

void Yuusya::SpecialAttack(Human& target)

投稿2019/04/17 14:32

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nigg_1513

2019/04/17 15:30

ありがとうございます! 無事解決致しました。
guest

0

一応書いておきます。

C++では、オブジェクトを引数として受け取る場合は 参照型にしたほうがいいみたいです。

オブジェクトによってはサイズがでかいので、参照型かポインタで渡すと使う容量を減らすことができる。
(最小限に)

ただ、普通に

C++

1void attack( Human &target ){ 2 // 処理 3}

とすると、書き換えるつもりがなかったのに...っていうこともありますので、書き換えをしないで閲覧するだけ ( 質問でいうShowstatus関数みたいな ) だったら、constもつける。

C++

1void Showstatus( const Human &target ) { 2 std::cout << "- " << target.GetName() << " の ステータス---" << std::endl; 3 std::cout << "たいりょく : " << target.GetVitality() << std::endl; 4}

投稿2019/04/18 02:08

BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nigg_1513

2019/04/18 08:11

ありがとうございます。そういうこともできるんですね。 大変、参考になります!
guest

0

void SpecialAttack(Human target);

C++の場合、引数は基本的に値渡しされるため
ここで渡されるtargetは呼び出し時に指定したオブジェクトのコピーになります。

void SpecialAttack(Human& target);として参照渡しにするか
lastBoss.damage(yuusya.specialAttack());
といった感じに内部状態が変化する受け手側のメンバ関数を呼び出すようにするとよいでしょう。

投稿2019/04/17 14:35

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nigg_1513

2019/04/17 15:31

ありがとうございます! メンバ関数の作成というアプローチ、非常に勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問