Я делаю симулятор популяции кролика для задачи, которую я делаю. У меня есть карта объектов класса. У меня также есть список, содержащий ключи для карты. Каждый раунд симулятора я хочу добавить в класс больше объектов и обновить свою карту и список. Для этого я написал отдельную функцию "создания", которая будет произвольно генерировать новые объекты класса и добавлять их к карте и добавлять ключи к списку.
Проблема заключается в том, что я вызываю функцию создания, затем перебираю по карте, используя список, в котором отображается карта или список пуст (не уверен, что). Если я итерацию по карте перед выходом из нее, она отображает только самые новые объекты. Если я переведу код для функции в основную функцию, она работает правильно (вызов дважды дает мне новые объекты, созданные на первой итерации кода, а также объекты, созданные второй итерацией).
Я предполагаю, что каждый раз, когда вызывается функция, создается новый список или карта и перезаписывает старый список или карту. Как я могу получить список и карту для перехода между основной функцией и функцией создания?
Вот мой код:
#include "stdafx.h"
#include <iostream>
#include "windows.h"
#include <string>
#include <sstream>
#include <array>
#include <time.h>
#include <conio.h>
#include <map>
#include <list>
class Bunny
{
public:
char fname;
int sex, age, color, status;
Bunny(int, int, int, int);
Bunny();
int s() { return (sex); }
int a() { return (age); }
int c() { return(color);}
int st() { return (status);}
int aging(int age) { return (age + 1); }
};
Bunny::Bunny(int s, int a, int c, int st)
{
sex = s;
age = a;
color = c;
status = st;
}
Bunny::Bunny(){}
void creation(std::map<std::string, Bunny> bunnies, std::list<std::string>names, int births);
std::string firstname(int s, int num)
{
std::string name;
if (s == 0)
{
switch (num)
{
case (0) :
name = "Tim";
break;
case (1) :
name = "Tom";
break;
case (2) :
name = "Mark";
break;
case (3) :
name = "Bob";
break;
case (4) :
name = "Rob";
break;
}
}
if (s == 1)
{
switch (num)
{
case (0) :
name = "Suzy";
break;
case (1) :
name = "Linda";
break;
case (2) :
name = "Mary";
break;
case (3) :
name = "Jan";
break;
case (4) :
name = "Julie";
break;
}
}
return (name);
}
void main()
{
int num = rand() % 5;
int n, births = 10;
std::list<std::string>names;
std::map<std::string, Bunny> bunnies;
srand(time(0));
creation(bunnies, names, births);
std::cout << "Number" << "\t" << "Name" << "\t" << "age" << "\t" << "Sex" << "\t" << "Color" << "\t" << "Vampire?" "\n";
n = 0;
for (std::list<std::string>::iterator it = names.begin(); it != names.end(); it++)
{
n++;
std::cout << n << "\t";
std::cout << " " << *it;
std::cout << "\t" << bunnies[*it].a() << "\t" << bunnies[*it].s() << "\t" << bunnies[*it].c() << "\t" << bunnies[*it].st() << "\n";
}
creation(bunnies, names, births);
_getch();
}
/*void year()
{
for (std::list<std::string>::iterator it = names.begin(); it != names.end(); it++)
{
bunnies[*it].aging(bunnies[*it].a())
}
}*/
void creation(std::map<std::string, Bunny> bunnies,std::list<std::string> names,int births)
{
int n;
for (n = 0; n < births; n++)
{
int num = std::rand() % 5;
char id = (std::rand() % 100) + 20;
int s = std::rand() % 2;
std::string f = firstname(s, num) + '_' + id;
int a = 0;
int c = std::rand() % 5;
int st;
if (rand() % 50 == 43) st = 1; else st = 0;
bunnies[f] = Bunny(s, a, c, st);
names.push_front(f);
//std::cout << f << " " << bunnies[f].a() << " " << bunnies[f].c() << "\n";
}
std::cout << "Number" << "\t" << "Name" << "\t" << "age" << "\t" << "Sex" << "\t" << "Color" << "\t" << "Vampire?" "\n";
n = 0;
for (std::list<std::string>::iterator it = names.begin(); it != names.end(); it++)
{
n++;
std::cout << n << "\t";
std::cout << *it;
std::cout << "\t" << bunnies[*it].a() << "\t" << bunnies[*it].s() << "\t" << bunnies[*it].c() << "\t" << bunnies[*it].st() << "\n";
}
}
Ваша проблема в том, что ваша основная функция - передать вашу карту и перечислить по значению, а не передавать по ссылке. Это означает, что ваша функция создания получает копию существующей карты/списка, а не ссылку на оригинал, который вы создали. Поскольку это только редактирование этой копии, любые изменения, которые она вносит, не будут отражены в основной функции.
Измените свою функцию создания:
void creation(std::map<std::string, Bunny> bunnies, std::list<std::string>names, int births)
в
void creation(std::map<std::string, Bunny>& bunnies, std::list<std::string>& names, int births)