在我的游戏中,我有随机名称的人,名字存储在字符串**
string **name_tabs()
{
string **names_tab;
int *max_0; *max_0 = 8; //girls number
int *max_1; *max_1 = 8; //boys number
names_tab = new string*[3];
names_tab[0] = new string[8]; //index 0 for girls_names_tab
names_tab[1] = new string[8]; //index 1 for boys_names_tab
names_tab[2] = new string[2];
//index 2 for max_index when parsing either boys or girls tab
names_tab[0][0] = "Fernande";
names_tab[0][1] = "Gertrude";
names_tab[0][2] = "Aicha";
names_tab[0][3] = "Pamella";
names_tab[0][4] = "Carla";
names_tab[0][5] = "Simone";
names_tab[0][6] = "Svetlana";
names_tab[0][7] = "Carmene";
names_tab[1][0] = "Ludo";
names_tab[1][1] = "Luc";
names_tab[1][2] = "Bruno";
names_tab[1][3] = "Olivier";
names_tab[1][4] = "Fabrice";
names_tab[1][5] = "Hadrien";
names_tab[1][6] = "Hazizoul";
names_tab[1][7] = "DK";
names_tab[2][0] = reinterpret_cast<char*>(max_0);
//this cast is just a try that seemed to work
names_tab[2][1] = reinterpret_cast<char*>(max_1);
//idem
return (names_tab);
}
当我第一次制作这个标签时,它只是一个字符串* [2]但我不想在以后遇到麻烦,如果我有更多的男孩而不是女孩,反之亦然,当我试图访问我的名字时,所以我我想做那样的事情:
_name = names_tab[_sex][rand() % *(names_tab[2][_sex])];
// with _name and _sex members of same class Chose
但它没有编译......
class/laChose.cpp:51:39: erreur: no match for ‘operator*’ (operand type is ‘std::string {aka std::basic_string<char>}’)
new_name = names_tab[_sex][rand() % *(names_tab[2][_sex])] + new_name;
我尝试了不同的演员阵容,但都没有奏效......
是否有可能做我想做的事情,或者我必须为我的names_tab制作一个结构?
struct names_tab
{
string *names_tab[2];
int index_max[2];
};
另外,如果有可能,有没有办法可以做到这一点(使用强制转换):
names_tab[2][0] = 8;
_name = names_tab[_sex][rand() % names_tab[2][_sex]];
期待您的回答!
[编辑]:
感谢您的帮助!我选择了解决方案:
[SOLUTION]:
vector<string> *name_tabs()
{
vector<string> *names_tab;
names_tab = new vector<string>[2];
names_tab[0].push_back("Fernande");
names_tab[0].push_back("Gertrude");
names_tab[0].push_back("Aicha");
names_tab[0].push_back("Pamella");
names_tab[0].push_back("Carla");
names_tab[0].push_back("Simone");
names_tab[0].push_back("Svetlana");
names_tab[0].push_back("Carmene");
names_tab[1].push_back("Ludo");
names_tab[1].push_back("Luc");
names_tab[1].push_back("Bruno");
names_tab[1].push_back("Olivier");
names_tab[1].push_back("Fabrice");
names_tab[1].push_back("Hadrien");
names_tab[1].push_back("Hazizoul");
names_tab[1].push_back("DK");
return (names_tab);
}
_name = names_tab[_sex][rand() % names_tab[_sex].size()]
答案 0 :(得分:2)
特别是在学习时,您应该更喜欢std::vector
或std::array<>
而不是C阵列:
constexpr std::array<std::vector<std::string>, 2> name_tabs() {
return {{"Fernande"s, "Gertrude"s, "Aicha"s,
"Pamella"s, "Carla"s, "Simone"s,
"Svetlana"s, "Carmene"s},
{"Ludo"s, "Luc"s, "Bruno"s,
"Olivier"s, "Fabrice"s, "Hadrien"s,
"Hazizoul"s, "DK"s}};
}
此代码未经测试,您可能需要在初始化中添加类型名称。
如果您有更多男孩或更多女孩,只需将他们的名字添加到列表中即可。 std::vector
将负责大小和内存管理。有了这个,你应该能够做到这样的事情:
_name = names_tab[_sex][rand() % names_tab[_sex].size()];
虽然我认为,您应该看一下更灵活的C++ random library,而不是旧的C函数rand()
。
答案 1 :(得分:1)
std :: string既没有operator *,也没有自动转换为char *。您必须使用显式转换为const char *,称为c_str():
_name = names_tab[_sex][rand() % *(names_tab[2][_sex].c_str()];
虽然这仍然是黑客行为,但您的结构解决方案是更合适的方式。更合适的是使用std :: vector而不是数组。
答案 2 :(得分:1)
您可以在字符串向量中存储名称列表,拼写为std::vector<std::string>
,然后生成0到7之间的随机数,并将其用作向量的索引以显示随机名称...
#include <iostream>
#include <ctime>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<string> m_vec = {"Fernande", "Gertrude", "Aicha", "Pamella", "Carla", "Simone", "Svetlana", "Carmene"};
vector<string> f_vec = {"Ludo", "Luc", "Bruno", "Olivier", "Fabrice", "Hadrien", "Hazizoul", "DK"};
srand(time(0)); // ensure truly randomized number
int x = rand() % 8; // find random number between 0 and 7
cout << "Random boy's name: " << m_vec[x] << endl;
x = rand() % 8;
cout << "Random girl's name: " << f_vec[x] << endl;
return 0;
}