私はランダムなモンスタージェネレータを作成し、次にモンスターのパラメータを印刷する必要があるコースのプログラムを作成しています。関数間で文字列を転送するC++
私が生成し、データを印刷する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
にある場合は行いますが、それは私が行う必要があるmain
で行います。
rvalueのアドレスを取っています。この場合は、一時的に 'createRandomMonster'関数から返されます。 'Monster'がすでに破壊されているため、後でアクセスするときに未定義の動作が起こります! –
文字列をどのように保護する必要がありますか?生成された数値はすべて正しく転送されますが、それは問題の文字列です。 –
いいえ、そうではありません。あなたのモンスターは '&createRandomMonster(g);'行の後に破壊され、もはや有効ではないメモリにアクセスします。しかし古いデータのいくつかはまだそこにあり、あなたはそれらを "エコー"として見ることができます。 ps。ポーランド語と英語のミキシングは、悪いスタイルと見なすことができます。 – Logman