Доступ к элементу структуры с использованием указателя на вектор структур. Ошибка: базовый операнд '->' имеет тип без указателя - PullRequest
0 голосов
/ 14 января 2011
#include <iostream>
#include <vector>

using namespace std;

struct s_Astruct {
    vector <int> z;
};


int main () 
{

    vector <s_Astruct> v_a;

    for(int q=0;q<10;q++)
    {
        v_a.push_back(s_Astruct());
        for(int w =0;w<5;w++)
            v_a[q].z.push_back(8);
    }

    vector <s_Astruct> * p_v_a = & v_a;
    cout << p_v_a[0]->z[4]; //error: base operand of '->' has non-pointer type 
                     //'__gnu_debug_def::vector<s_Astruct, std::allocator<s_Astruct> >'


}

Кажется, есть проблема с такого рода операцией, которую я не понимаю.В коде, над которым я работаю, на самом деле есть такие вещи, как p_class-> vector [] -> vector [] -> int;и я получаю похожую ошибку.

Ответы [ 5 ]

2 голосов
/ 14 января 2011

p_v_a - это vector*, что делает p_v_a[0] a vector (поскольку p_v_a[0] эквивалентно *(p_v_a+0)), поэтому использование указателя на оператор члена (->) не приведет кработать над этим.Вы, вероятно, хотите (*p_v_a)[0].z[4].

2 голосов
/ 14 января 2011

Вы хотите сделать это:

cout << ((*p_v_a)[0]).z[4];

Что вы делаете, так это разыменовываете указатель, используя [], захватывает 0-е смещение и затем пытается разыменовать не указатель.

Еще один способ сделать это (что просто ужасно):

cout << (p_v_a[0][0]).z[4];
1 голос
/ 14 января 2011

В следующих случаях:

vector<s_Astruct>* p_v_a = &v_a;
cout << p_v_a[0]->z[4]

У вас есть указатель на вектор, но вы не разыменовали этот указатель перед попыткой вызова operator[].Затем вы попытались разыменовать s_Astruct в индексе 0, но это не указатель.

Попробуйте это:

vector<s_Astruct>* p_v_a = &v_a;
cout << (*p_v_a)[0].z[4];

Надеюсь, что поможет.

1 голос
/ 14 января 2011

Когда вы используете указатель [] для указателя, он также разыменовывается. Использование инфиксного оператора разыменования -> в типе без указателя приводит к правильной ошибке, которую вы описываете.

0 голосов
/ 31 марта 2011

Это сводило меня с ума - мне удалось получить

std :: cout << (nsNLs-> back ()). Name

работает, но я не могу заставить работать ссылку на индексный массив (даже с паренами, которые мне не нужны).

std :: cout << || здесь? || nsNLs || здесь? || [intVal] || здесь? || Имя </p>

Я пробовал все варианты разыменования и заключения в скобки вокруг указателя на вектор, не нажимая на (|| вещь, на которую указывает || passVariable) [] .name

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

@ Марк, очень четкое объяснение, вы приводите что-то, что работает, и операция достаточно необычна, так что я чувствую себя лучше с паренами вокруг разыменования векторного объекта И разыменования элемента массива / указателя. Я видел ваше решение, попробовал его, и оно сработало.

@ Tomalek, Ваш ответ - второй по простоте, и он получает дополнительное очко в моей книге за то, что показал проблему, пошагово рассмотрел ее, объяснил ошибку, а затем предложил исправление. Немного спортивнее, чем у Марка, только один набор скобок.

@ user470379, ваш ответ верный, и вы показываете успешное решение, но за ним труднее следовать, и ответ в конце.

Спасибо всем вам, я проголосовал за вас.

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