Sam*_*orn -3 c++ constructor vector c++17
我正在开发一个程序来帮助我进行世界建设,该计划会根据用户选择的国家(德语,拉丁语,东部)随机生成定居点(村庄,村庄,城镇,城市)。我已经集成了一种定居者生成系统,以在定居点中创建定居者,每个定居者使用构造函数并将结果作为对象保存在向量中,每个定居者均具有名称,年龄,性别和财富。不幸的是,该程序创建了一个完整的克隆种群,用相同名称,年龄等的移居者填充了载体。
我曾尝试在for循环中初始化Settler类的构造函数,但除了在您每次请求其中一个有关定居者的信息时,会导致获得一组不同的定居者之外,它没有做任何更改。
class Settler {
public:
int settlerAge;
string settlerName;
string settlerGender;
string settlerWealth;
Settler(int type, int nation, int quantity) {
int result{};
string givenName{};
string surName{};
// Latin Male First Name
string latinMaleName[15] = {"Faustus", "Mamercus", "Mettius", "Appius", "Hostus", "Quintus", "Cossus", "Secundus", "Servius", "Gallio", "Tettienus", "Petronius", "Paesentius", "Pescunnius", "Clodius"};
// Latin Surname
string latinSurname[30] = {"Natalinus", "Lucilianus", "Crispian", "Laetinianus", "Falco", "Otho", "Plautius", "Pascentius", "Lepidus", "Moderatus", "Caeparius", "Caetronius", "Hostilius", "Aedinius", "Papius", "Gennadia", "Triaria", "Planta","Amantia", "Mico", "Opilio", "Augusta", "Laevina", "Longina", "Mico", "Servana", "Sicula", "Iovina", "Albana", "Concessa"};
// Latin Female First Name
string latinFemaleName[15] = {"Vorenia", "Tuccia", "Consentia", "Vinicia", "Aurelia", "Helvia", "Fabia", "Aemilia", "Petilia", "Cloelia", "Viducia", "Betiliena", "Sornatia", "Memmia", "Pedia"};
// As above, so below...
string germanMaleName[15] = {"Carsten", "Benedikt", "Emmerich", "Tillmann", "Maik", "Severin", "Adrian", "Gregor", "Ingolf", "Germund", "Adelmar", "Eckard", "Raimund", "Marwin", "Dietmar"};
string germanSurname[30] = {"Loeb", "Spielberg", "Lindemann", "Frenz", "Buxbaum", "Macher", "Bacharach", "Homrighausen", "Faulhaber", "Herder", "Germar", "Eisen", "Hackl", "Specht", "Rossmann", "Erdmann", "Osterhaus", "Steinsaltz", "Spiegelmann", "Lindemann", "Kluckhohn", "Kuttner", "Seelmann", "Sattler", "Kautner", "Dunhaupt", "Scharf", "Preisner", "Werthner", "Breitner"};
string germanFemaleName[15] = {"Selina", "Isabel", "Walburg", "Berta", "Kate", "Gisela", "Amelie", "Ronja", "Karin", "Lena", "Alexandra", "Sarah", "Monica", "Kai", "Nadja"};
// NOTE: Surname is before given name in eastern nations
string easternMaleName[15] = {"Nikki", "Moronobu", "Yaichiro", "Shuncho", "Tamasaburo", "Sekien", "Kazutoshi", "Yasuhide", "Omezo", "Kinzo", "Junji", "Utamuro", "Hisaki", "Taki", "Mitsuo"};
string easternSurname[30] = {"Maki", "Shinohara", "Tsukino", "Ikeda", "Matsutoya", "Sakata", "Horiuchi", "Suda", "Tsuga", "Kawano", "Kanbayashi", "Kirigaya", "Sakimoto", "Urushido", "Inaba", "Tsukiyomi", "Saeki", "Soga", "Morioka", "Yamabe", "Nakajima", "Maruyama", "Suga", "Kamino", "Kawamoto", "Takanashi", "Ito", "Kuramoto", "Maeda", "Kanemaru"};
string easternFemaleName[15] = {"Saito", "Ane", "Fuuko", "Taji", "Isoko", "Gen", "Kuwa", "Taira", "Sachi", "Uka", "Ryoko", "Hina", "Mitsu", "Asa", "Tomie"};
// Gender Generation (Male/Female)
result = (1 + (rand() % 2));
if (result > 1) {
settlerGender = "female";
} else {
settlerGender = "male";
}
// Name and Age Generation (See Arrays)
result = (rand() % 15);
switch(nation) {
case 1: // Latin (Equal split of ages)
if (settlerGender == "male") {
givenName = latinMaleName[result];
} else {
givenName = latinFemaleName[result];
}
result = (1 + (rand() % 100));
if (result >= 66) {
settlerAge = (41 + (rand() % 30));
} else if (result > 33 || result < 66) {
settlerAge = (22 + (rand() % 41));
} else {
settlerAge = (1 + (rand() % 22));
}
result = (rand() % 30);
surName = latinSurname[result];
settlerName = givenName + " " + surName;
break;
case 2: // German (More young people)
if (settlerGender == "male") {
givenName = germanMaleName[result];
} else {
givenName = germanFemaleName[result];
}
result = (1 + (rand() % 100));
if (result >= 90) {
settlerAge = (41 + (rand() % 30));
} else if (result > 40 || result < 90) {
settlerAge = (22 + (rand() % 41));
} else {
settlerAge = (1 + (rand() % 22));
}
result = (rand() % 30);
surName = germanSurname[result];
settlerName = givenName + " " + surName;
break;
case 3: // Eastern (More older people)
if (settlerGender == "male") {
givenName = easternMaleName[result];
} else {
givenName = easternFemaleName[result];
}
result = (1 + (rand() % 100));
if (result >= 40) {
settlerAge = (41 + (rand() % 30));
} else if (result > 20 || result < 40) {
settlerAge = (22 + (rand() % 41));
} else {
settlerAge = (1 + (rand() % 22));
}
result = (rand() % 30);
surName = easternSurname[result];
settlerName = surName + " " + givenName;
break;
}
// Wealth Generation (Poor/Decent/Rich: Based on Surname)
switch(type){
case 1: // Hamlet
if (result >= 28) {
settlerWealth = "Rich";
} else if (result > 24 || result < 28) {
settlerWealth = "Decent";
} else {
settlerWealth = "Poor";
}
break;
case 2: // Village
if (result >= 26) {
settlerWealth = "Rich";
} else if (result > 19 || result < 26) {
settlerWealth = "Decent";
} else {
settlerWealth = "Poor";
}
break;
case 3: // Town
if (result >= 25) {
settlerWealth = "Rich";
} else if (result > 9 || result < 25) {
settlerWealth = "Decent";
} else {
settlerWealth = "Poor";
}
break;
case 4: // City
if (result >= 20) {
settlerWealth = "Rich";
} else if (result > 9 || result < 20) {
settlerWealth = "Decent";
} else {
settlerWealth = "Poor";
}
break;
}
}
};
Run Code Online (Sandbox Code Playgroud)
Settlement objSettlement(tempType,tempNation);
int tempNum = objSettlement.settlementQuantity;
std::vector<Settler> objSettler(objSettlement.settlementQuantity, Settler(tempType, tempNation, tempNum));
cout << "Welcome to the " << objSettlement.settlementType << " " << objSettlement.settlementName << " in the " << objSettlement.settlementNation << " nation!\n";
cout << "Featuring a population of " << objSettlement.settlementQuantity << " with " << objSettlement.settlementWealth << " wealth.\n\n";
bool repeat = true;
while (repeat == true) {
cout << "Enter the ID of a settler you would like to read about (from 0-" << (objSettlement.settlementQuantity - 1) << ", or enter 999999 to exit): ";
cin >> tempNum;
cout << "\n\n";
if (tempNum == 999999) {
repeat = false;
} else {
cout << objSettler[tempNum].settlerName << ", " << objSettler[tempNum].settlerGender << ", is " << objSettler[tempNum].settlerAge << " years old and has " << objSettler[tempNum].settlerWealth << " wealth.\n\n";
}
}
Run Code Online (Sandbox Code Playgroud)
对于上下文,“ objSettlement”是指随机生成的“结算”实例,而“ .settlementQuantity”是表示结算人口的整数。
因此,当我创建一个有30个人的拉丁小村庄时,程序会创建一个包含30种情况的向量:“ Faustus Crispian,男性,现年41岁,财富较差。” 不管我输入的数字是0-29。
为什么矢量初始化会使数组中的所有对象都相同?
这个 :
std::vector<Settler> objSettler(objSettlement.settlementQuantity, Settler(tempType, tempNation, tempNum));
Run Code Online (Sandbox Code Playgroud)
创建一个具有objSettlement.settlementQuantity相同对象副本的向量Settler(tempType, tempNation, tempNum)。
有关各种向量构造器如何工作的详细信息,请参见此参考页。
这样的事情可能更接近您想要的东西:
std::vector<Settler> objSettler;
for (int i = 0; i < objSettlement.settlementQuantity; ++i) {
objSettler.emplace_back(tempType, tempNation, tempNum);
}
Run Code Online (Sandbox Code Playgroud)