C ++在函数之间传递字符串

时间:2017-03-23 22:02:53

标签: c++

我正在为我的课程编写一个程序,我必须制作一个随机怪物生成器,然后打印怪物的参数。

我在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中执行此操作则不行,我需要这样做。

4 个答案:

答案 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,它将执行所有扩展(如果需要),这将是好的,无需担心写出边界,当你从函数返回或执行时就像魔术一样工作后来平等