問題のコードは↓です。
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <vector>
class test {
private:
int number;
public:
void number_reduce(int num);
int number_give();
void set(int num);
int judge(std::vector<test> test_vector);
};
void test::number_reduce(int num) {
number -= num;
}
int test::number_give(){
return number;
}
void test::set(int num) {
number = num;
}
int test::judge(std::vector<test> test_vector) {
auto result = std::find_if(test_vector.begin(), test_vector.end(), [](test t) {return t.number == 5; });
if (result == test_vector.end()) {
return 0;
}else {
test result_ob = *result;
result_ob.number_reduce(1);
printf("私は%d番です\n", number);
printf("悪いのは%d番です\n", result_ob.number_give());
}
}
int main(void){
test ob[10];
std::vector<test> test_vector(10);
int i;
for (i = 0; i <= 9;i++) {
ob[i].set(i);
test_vector.push_back(ob[i]);
};
for (i = 0; i <= 9; i++) {
ob[i].judge(test_vector);
};
return 0;
}
【疑問点】
↑のコードではnumber = 5のオブジェクトが発見された際に、そのオブジェクトのnumberを減らす関数を実行しているので最下部のfor の2週目以降は検索してもnumber = 5のオブジェクトは発見されないはずなのですが、結果は↓のようになってしまいます
結果:私は0番です
悪いのは4番です
私は1番です
悪いのは4番です
私は2番です
悪いのは4番です
私は3番です
悪いのは4番です
私は4番です
悪いのは4番です
私は5番です
悪いのは4番です
私は6番です
悪いのは4番です
私は7番です
悪いのは4番です
私は8番です
悪いのは4番です
私は9番です
悪いのは4番です
number_reduce関数を使用した直後はnumberが4になっていることが確認できるのですが、それ以降は5に戻り再び1引かれて4になり……ということを繰り返してしまっているように感じます。
色々と調べたのですが、かれこれ1週間以上悩んでいます。
恐らくはコピーと参照の違い等の初歩的な問題だとは思うのですが……ご教授ください。申し訳ないです。
【質問】
2点です。
①なぜnumber = 5を持つオブジェクトのnumberを減らすことができないのか。(なぜnumber = 5へ戻ってしまうのか)
②find_if を使用して発見したオブジェクトのprivateの変数を変更することは可能か。
以上です。よろしくお願いいたします。