Использование вектора указателя для вектора ссылки недопустимо? - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть один вопрос.Это нормально использовать вектор указателей в качестве опорного вектора

Struct Child
{
    int n;
    void func(int _n) 
    { 
        n = _n;
    };

}

struct Parent
{
    std::vector<Child> vec;    
}

void func(Parent* p)
{
    std::vector<Child>& ref = p->vec;  // is this ok?
    int value = 10;
    ref[0].func(value); // is this ok?
}

int main()
{
...
...
    Parent p;
    func(&p);
...
...


    return 0;
}

компилятор GCC 4.4.7 (в C ++ 11)
Я думаю, было бы хорошо, если изменено значение ссылки?

ref[0].func(value)

Спасибо.

Ответы [ 2 ]

1 голос
/ 25 сентября 2019
std::vector<Child>& ref = p->vec;  // is this ok? yes
int value = 10;
ref->func(value); // is this ok? no

ref не является указателем, поэтому вы не можете использовать оператор доступа к члену ->

ref является вектором, поэтому вам нужно выбрать, какой Child вы хотите использовать.

ref[ child_index ].func(value);
0 голосов
/ 25 сентября 2019

ссылка - это не что иное, как другое имя объекта.Так что это все одинаково:

std::vector<Child>& ref = p->vec;
std::vector<Child>& vecAlias = ref;
int value = 10;
ref[0].func(value);
vecAlias[0].func(value);
p->vec[0].func(value);

Вы не можете изменить значение ссылки.Неинициализированные ссылки не существуют.Как только он инициализирован, его невозможно изменить.Указатели, с другой стороны, имеют аналогичную цель: они разрешают доступ к одним и тем же данным из разных мест.Вы всегда можете изменить то, на что указывает указатель.Но указатели также более подвержены ошибкам, поскольку могут быть неинициализированы или инициализированы нулем.Поэтому старайтесь придерживаться ссылок, если вам не нужна эта гибкость.

...