0

これが偽のコードサンプルです

vector<Fred> gFred;
{
    // init gFred

    Fred &fred = gFred[0];

    size_t z = 0;
    do
    {
        fred = gFred[z];

        // do odd processing with fred

        z++;
    }
    while (fred.lastElementInSet == 0);
}

私の注意を引いたのは、gFred[0]が上書きされていたという事実でした。これにより、新しい要素への参照としてfredを初期化するのではなく、

fred = gFred[z];

実際に起こっていることは、gFred[1]がgFred[0]を上書きしているということです。

私はここで正しいことを考えています。私自身が数回頭を上げて、これをポインターの実装に変えて、私の人生を続けることです。

私はこれを正しく診断しましたか?または私はより多くの教育が必要ですか?

4

5 に答える 5

6

はい、そこに構造コピーを取得しています。参照はリバウンドできません。つまり、初期化されると同じままになります。

そして、あなたの解決策も適切です。しかし、頭を叩くことについてのダンノ。

于 2009-02-26T19:36:40.630 に答える
3

参照を見る 1 つの方法は、それらを暗黙的に逆参照されたポインターと見なすことです。簡単に言えば、それらはポインターですが、通常の変数アクセス構文を使用して使用できます

Fred &fred = gFred[0];

これにより、ベクトル gFred の最初の要素への参照が作成されます。(ちなみに、この中に何かありますか?) コンパイラは次のように処理します。

Fred *pFred = &gFred[0];

今、あなたがするとき:

fred = gFred[z];

コンパイラは実際に次のようなことを行います。

*pFred = gFred[z];

翻訳されたものは次のとおりです。

gFred[0] = gFred[z];

Nで開始する N 個の要素がある場合は、この時間を実行していますvector

のすべての要素を初期化しようとしている場合は、次のvectorコンストラクターを試してください。

vector(size_type n, const T& t)      

どこ、

n = size of vector
t = gFred[0]
于 2009-02-26T19:44:04.530 に答える
1

あなたが投稿したコード (および Fred タイプが POD であると仮定) では、gFred[0] が上書きされ、最後の z の gFred[z] にあったもののコピーが含まれることになります。

ポインターの実装を使用するように切り替えるか、参照をより厳密にスコープすることができます。

{    
    size_t z = 0;
    do
    {
        Fred &fred = gFred[z];
        // do odd processing with fred
        z++;
    }
    while (fred.lastElementInSet == 0);
}
于 2009-02-26T19:48:55.343 に答える
0

あなたが与えるコードでfredは、常に参照していますgFred[0]fredループの反復ごとに参照を変更する場合は、行を削除しますFred &fred=gFred[0];fred = gFred[z];次に、に置き換えFred &fred = gFred[z]ます。fredこのようにして、ループが実行されるたびに参照を再初期化します。

于 2009-02-26T19:44:28.240 に答える
0

コンパイルされたメカニズムは dirkgently の回答で説明されていますが、基になる説明は MSN のものです (「参照を再バインドできません」)。

このように読む方が簡単かもしれません:

もしも

ptr = &xxx;

の内容ptrが のアドレスであることを意味しますxxx

&fred = gFred[0];

のアドレスfredを指すように設定されていることを意味しgFred[0]ます。IOWfredは のエイリアスになりましたgFred[0]fred = xxxそれが上書きを行う理由ですgFred[0]

于 2009-02-26T19:52:42.760 に答える