我正在为我的课程编写一个程序,我必须制作一个随机怪物生成器,然后打印怪物的参数。
我在format()
中使用此循环来生成然后打印数据:
main
这个用于生成怪物的功能:
for (g=0; g < m; g++)
{
tab[g] = &createRandomMonster(g);
printMonsterData(*tab[g]);
}
这个打印功能:
Monster createRandomMonster(int g)
{
ostringstream buffer;
buffer << ++g;
string name = buffer.str();
Monster nowypotwor{ name, MonsterType(rand() % 6 + 1), rand() % 25 + 5, (double)(10.0 + (rand() / (double)(RAND_MAX))*(30.0 - 10.0)) };
return nowypotwor;
}
我不打印怪物的名字。如果我在void printMonsterData(const Monster &potwor)
{
cout << "potwor: " << potwor.name << endl << "typ: " << getTypeName(MonsterType(potwor.type)) << endl << "atak: " << potwor.attack << endl << "zycie: " << potwor.health << endl << endl;
}
中printMonsterData
,但如果我在createRandomMonster
中执行此操作则不行,我需要这样做。
答案 0 :(得分:0)
你需要捕获怪物回归。即 Monster aMonster = createRandomMonster(g); 然后你可以说tab [g] =&amp; aMonster。
编辑 - 即使使用这个解决方案,tab [g]只能用于for循环的生命周期,也就是aMonster的生命。这是通过参考操作的另一个结果。如果你在主要的最外层范围内声明一个怪物,你可以绕过这个限制,然后返回...
有没有理由为什么tab是Monster *数组而不是Monster数组?除非我遗漏某些内容,否则成为后者会更有意义...特别是因为你立即将它推迟到参考打印
答案 1 :(得分:0)
这是错误的:
tab[g] = &createRandomMonster(g);
createRandomMonster
按值返回Monster
类实例,因此它返回的是一个临时对象,它在完整语句结束后(在分号;
字符之后)被销毁。因此,如果您使用&
获取此临时对象的地址,您实际上正在获取一个很快被销毁的临时地址,并且在您稍后的代码执行中放入tab[g]
悬空指针导致未定义的行为。
我建议您不要将Monster
个对象存储为tab
中的指针,而是按值:
std::vector<Monster> g;
如果你需要指针,那么将它们存储为:
std::vector<std::unique_ptr<Monster>> g;
并将createRandomMonster
更改为:
std::unique_ptr<Monster> createRandomMonster(int g)
{
ostringstream buffer;
buffer << ++g;
string name = buffer.str();
std::unique_ptr<Monster> nowypotwor = std::make_unique<Monster>(name, MonsterType(rand() % 6 + 1), rand() % 25 + 5, (double)(10.0 + (rand() / (double)(RAND_MAX))*(30.0 - 10.0)));
return nowypotwor;
}
和
tab[g] = createRandomMonster(g);
答案 2 :(得分:0)
你应该让函数createRandomMonster返回一个指向Monster(Monster *)的指针,或者更好的是,改变&#34; tab&#34;保持智能指针(例如shared_ptr)而不是普通指针,并从函数返回。
std::vector<std::shared_ptr<Monster>> tab;
std::shared_ptr<Monster> createRandomMonster(int g)
{
ostringstream buffer;
buffer << ++g;
string name = buffer.str();
return std::make_shared<Monster>(name,
MonsterType(rand() % 6 + 1), rand() % 25 + 5,
(double)(10.0 + (rand() / (double)(RAND_MAX))*(30.0 - 10.0)));
}
for (g=0; g < m; g++)
{
tab[g] = createRandomMonster(g);
printMonsterData(*tab[g]);
}
如果您不需要具有多态行为,最好在向量中保存值并将rvalue复制到选项卡:
std::vector<Monster> tab;
for (g=0; g < m; g++)
{
tab[g] = createRandomMonster(g);
printMonsterData(tab[g]);
}
答案 3 :(得分:0)
将字符串传递给函数可以遵循以下两种方法之一:
1)C样式 - 声明一个数组(static / global / local)并将其作为指针传递给被调用函数的地址(或C ++中的引用)。如果动态分配,则改为传递指针
2)C ++风格 - 使用std :: string,它将执行所有扩展(如果需要),这将是好的,无需担心写出边界,当你从函数返回或执行时就像魔术一样工作后来平等