Я получаю копию структуры здесь? - PullRequest
0 голосов
/ 26 февраля 2009

Вот пример поддельного кода

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] перезаписывался. Это заставляет меня думать, что вместо init fred как ссылки на новый элемент,

fred = gFred[z];

На самом деле происходит то, что gFred [1] перезаписывает gFred [0].

Я думаю, что правильное здесь сделать, это несколько раз поднять голову и превратить это в реализацию указателя и двигаться дальше в моей жизни.

Правильно ли я диагностировал это? или мне нужно больше образования?

Ответы [ 5 ]

6 голосов
/ 26 февраля 2009

Да, вы получаете копию структуры там. Ссылки не могут быть восстановлены, то есть они остаются прежними после инициализации.

И ваше решение тоже подходит. Не знаю о том, чтобы ударить себя по голове.

3 голосов
/ 26 февраля 2009

Один из способов взглянуть на ссылки - думать о них как о неявно разыменованных указателях. Проще говоря, они являются указателями, но вы можете использовать обычный синтаксис доступа к переменным для их использования

Fred &fred = gFred[0];

Это создает ссылку на первый элемент вашего вектора gFred. (Кстати, у вас есть что-нибудь внутри этого?) Компилятор сделает что-то вроде этого:

Fred *pFred = &gFred[0];

Теперь, когда вы делаете:

fred = gFred[z];

компилятор действительно сделает что-то вроде этого:

*pFred = gFred[z];

что в переводе означает:

gFred[0] = gFred[z];

И вы делаете это N раз, если в вашем vector.

есть N элементов.

Если вы пытаетесь инициализировать все элементы вашего vector, попробуйте этот конструктор:

vector(size_type n, const T& t)      

, где

n = size of vector
t = gFred[0]
1 голос
/ 26 февраля 2009

С кодом, который вы разместили (и предполагая, что тип Fred является POD), gFred [0] перезаписывается и в итоге будет содержать копию того, что было в gFred [z] для последнего z.

Вы могли бы переключиться на использование реализации указателя, или вы могли бы охватить ссылку более близко:

{    
    size_t z = 0;
    do
    {
        Fred &fred = gFred[z];
        // do odd processing with fred
        z++;
    }
    while (fred.lastElementInSet == 0);
}
0 голосов
/ 26 февраля 2009

скомпилированный механизм объясняется ответом Диркгентли, а основное объяснение - ответом MSN («Ссылки не могут быть восстановлены»).

может быть, так проще читать:

если

ptr = &xxx;

означает, что содержимое ptr является адресом xxx, тогда

&fred = gFred[0];

означает, что для адреса из fred установлено значение gFred[0]. IOW, fred теперь является псевдонимом gFred[0]. поэтому fred = xxx перезаписывает gFred[0]

0 голосов
/ 26 февраля 2009

В указанном вами коде fred всегда ссылается на gFred[0]. Если вы хотите, чтобы ссылка fred изменялась при каждой итерации цикла, удалите строку Fred &fred=gFred[0];. Затем замените fred = gFred[z]; на Fred &fred = gFred[z]. Таким образом, вы повторно инициализируете ссылку fred каждый раз, когда выполняется цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...