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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C++

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

Q&A

解決済

2回答

2529閲覧

(C++)メンバ変数が更新されない

komats

総合スコア9

C++

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

0グッド

0クリップ

投稿2021/05/12 12:27

前提・実現したいこと

C++初心者です.
下記のソースコードで2名のケンカを表現しました.
しかし,実行結果に示した通り,2人の体力(hp)が更新されません.
何故なのでしょうか?

どなたかご教授いただければ幸いです.

該当のソースコード

cpp

1#include<iostream> 2#include<thread> 3using namespace std; 4 5class human{ 6 private: 7 string name; 8 public: 9 int hp; 10 int atk; 11 human(string s, int hp, int atk){ 12 this->name = s; 13 this->hp = hp; 14 this->atk = atk; 15 } 16 void kogeki(human h){ 17 if(h.hp > this->atk){ 18 h.hp = h.hp - this->atk; 19 cout << h.name << " lost " << this->atk << "points." << endl; 20 cout << "Now " << h.hp << "points." << endl; 21 cout << endl; 22 }else{ 23 h.hp = 0; 24 cout << h.name << " is dead." << endl; 25 cout << endl; 26 } 27 } 28}; 29 30int main(){ 31 human a = human("A", 100, 50); 32 human b = human("B", 1000, 5); 33 while(1){ 34 a.kogeki(b); 35 b.kogeki(a); 36 if(a.hp == 0 || b.hp == 0){ 37 break; 38 } 39 this_thread::sleep_for(chrono::seconds(1)); 40 } 41}

出力

B lost 50points. Now 950points. A lost 5points. Now 95points. B lost 50points. Now 950points. A lost 5points. Now 95points. B lost 50points. Now 950points. A lost 5points. Now 95points. ^C

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

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

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

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

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

guest

回答2

0

mainでのa.kogeki(b);は、bというオブジェクトを「値渡し」しています。
つまりオブジェクトbのコピーがkougekiに渡されます。これはbの実体とは別のものです。
ですからkougekihのメンバーを操作してもmainでのbは変化しません。
引数の値渡し、ポインタ渡し、参照渡しについて学びましょう。

投稿2021/05/12 12:42

編集2021/05/12 12:43
itagagaki

総合スコア8402

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

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

komats

2021/05/12 12:55

なるほど...当方pythonしか触ったことが無いので、必ず参照渡しだと思い込んでいたようです。 ともあれ問題点は理解できました。ありがとうございます!
guest

0

ベストアンサー

C++の場合、クラス引数はデフォルトでコピーされます。コピーを書き換えても、もともとの値に影響はありません。

コピーせずに渡したい場合は、void kogeki(human& h)のように参照を引数として取る形にする必要があります。

投稿2021/05/12 12:39

maisumakun

総合スコア146018

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

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

komats

2021/05/12 12:54

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問