0

私が理解していることから、構造全体を関数に渡すことと、参照によってそうしないことは、システムリソースに負担をかける可能性があります。それで、私はそれらを参照によって渡すことについてのハンドルを得たいと思います。次の構造でキャラクタージェネレーターを作成しています。

struct Stats{
    string name;
    int level;
    int HP;
    int STR;
    int CON;
    int DEX;
    int INT;
    int WIS;
    int CHA;};

struct Growth{
    int HPperlvl;
    int STRperlvl;
    int CONperlvl;
    int DEXperlvl;
    int INTperlvl;
    int WISperlvl;
    int CHAperlvl;};

struct Holdstats{
    Stats classstats;
    Growth classgrowth;};
const int SIZE = 10;

Holdstats classlist[SIZE] = {
    { {"Fighter", 1, 18, 10, 10, 10, 10, 10, 10}, {1,1,1,1,1,1,1} },
    { {"Wizard", 1, 10, 10, 10, 10, 10, 10}, {1,1,1,1,1,1,1}},
    { {"Rogue", 1, 10, 10, 10, 10, 10, 10}, {1,1,1,1,1,1,1}}
} //These are just some examples, will be filled later

Holdstats charlist[SIZE]; //Empty array to store created characters

プログラムで最も単純な関数を使用して、問題を説明します。次の関数は、構造体のどの位置に渡されても、渡された構造体の情報を表示することを目的としています。位置はプログラムで事前に定義されています。構造体と位置の両方を参照して渡したいと思います。

void dispinfo(const Holdstats &p, int &i) //Should be passed a position and a structure
{
    cout << endl << "\tHere is the Character/Class info you requested: "
        << "\n\t----------------------------------------------"
        << "\nName:\t\t" << p[i].classstats.name << endl
        << "Level:\t\t" << p[i].classstats.level << endl
        << "Hit Points:\t\t" << p[i].classstats.HP << endl
        << "Strength:\t\t" << p[i].classstats.STR << endl
        << "Constitution\t\t" << p[i].classstats.CON << endl
        << "Dexterity\t\t" << p[i].classstats.DEX << endl
        << "Intelligence\t\t" << p[i].classstats.INT << endl
        << "Wisdom\t\t" << p[i].classstats.WIS << endl
        << "Charisma\t\t" << p[i].classstats.CHA << endl;

}

私が得ている問題はに関係していp[i]ます。私のコンパイラは、Holdstats&pの場合、[]これらのオペランドに一致する演算子はないと言っています。関数ヘッダーで以前に定義された構造体配列の名前(「classlist」など)を使用するだけですが、構造体の任意の配列を関数に渡すことができるようにしたいと思います。

私の知る限り、私は以前に定義された配列の要素iを呼び出しています。しかし、明らかに、私は何か間違ったことをしています。誰かが問題を見ることができますか?

4

2 に答える 2

1

助けようとするいくつかの考え。

  • i内の値を変更する場合を除いdispinfo()て、参照によって渡す理由は実際にはありません。anintを渡すこととanへの参照を渡すことintはおそらく同等です(両方とも32ビット可能性が高い)がint、値を取得するには逆参照する必要があるため、参照によってそれにアクセスすることは(自明に)より負担がかかります。
  • Holdstats structの配列がに渡されることを期待しているようですdispinfo()。その場合、配列は常に参照によって渡されるため、参照シンボルは必要ありません。Holdstats p[]代わりにを使用する必要がconst Holdstats &pあります。そうすれば、配列は問題なく渡されます(そしてコンパイルできます)。呼び出すdispinfo()には、出力する配列名とインデックスを渡すだけです。

それらの配列ではなくdispinfo()、単一のみを受け取るように変更することを検討することをお勧めします。Holdstats structその場合、関数は次のようになります。

void dispinfo(const Holdstats &p) //Should be passed a structure only
{
    cout << endl << "\tHere is the Character/Class info you requested: "
        << "\n\t----------------------------------------------"
        << "\nName:\t\t" << p.classstats.name << endl
        << "Level:\t\t" << p.classstats.level << endl
        << "Hit Points:\t\t" << p.classstats.HP << endl
        << "Strength:\t\t" << p.classstats.STR << endl
        << "Constitution\t\t" << p.classstats.CON << endl
        << "Dexterity\t\t" << p.classstats.DEX << endl
        << "Intelligence\t\t" << p.classstats.INT << endl
        << "Wisdom\t\t" << p.classstats.WIS << endl
        << "Charisma\t\t" << p.classstats.CHA << endl;

}

次に、への呼び出しは次のdispinfo()ようになります。

Holdstats classlist[SIZE] = { [...] };
dispinfo(classlist[0]);
dispinfo(classlist[1]);
[...]

これは、次のように配列とインデックスを渡すことで効果的に実行することです。dispinfo(classlist,0);

于 2012-12-12T20:04:25.013 に答える
1

さて、これ:

void dispinfo(const Holdstats &p, int &i)

単一のオブジェクトへの参照を渡していることを示します。単一のオブジェクトを配列(p[])として逆参照することはできないため、診断は理にかなっています。

この場合、おそらく必要なのは次のとおりです。

void dispinfo(const Holdstats *p, int &i)

または、代わりに:

void dispinfo(const Holdstats p[], int &i)

パラメータとして渡された配列は最初の要素へのポインタに減衰するため、それらはほぼ同じです(少なくとも1次元配列の場合)。

オブジェクトの受け渡しとオブジェクトへの参照の違いは、多くの場合、パラメーターの受け渡しスペース(通常はスタック上)を過剰に使用しないようにするために行われることに注意してください。これは、次の違いです。

void dispinfo(const Holdstats p, int &i)

これにより、オブジェクト全体のコピーがスタックに配置され、次のようになります。

void dispinfo(const Holdstats &p, int &i)

そうではありません。参照は通常、非表示のポインターとして実装されるため、ある意味では、コードはポインターを渡すのと非常に似ていますが、C ++レベルでのセマンティクス(パラメーターで実行できること)は異なります。単一のオブジェクトをポインターまたは参照として渡すと、ほぼ同じコードになりますが、配列を渡す場合は、配列またはポインターとして指定する必要があります。

于 2012-12-12T20:09:41.850 に答える