繁体   English   中英

使用指向结构向量的指针访问结构成员。 错误:“->”的基本操作数具有非指针类型

[英]Acessing a struct member, using a pointer to a vector of structs. Error:base operand of '->' has non-pointer type

#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之类的东西; 而且我遇到了类似的错误。

您想这样做:

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

您正在做的是通过使用[]取消引用指针并获取第0个偏移量,然后尝试取消引用非指针。

另一种方法(这很丑):

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

p_v_a是一个vector* ,使p_v_a[0]成为一个vector (因为p_v_a[0]等于*(p_v_a+0) ),所以使用指向成员运算符( -> )的指针将*(p_v_a+0)该问题。 您可能需要(*p_v_a)[0].z[4]

在指针上使用index []运算符时,也会取消引用它。 在非指针类型上使用infix取消引用运算符->正确地导致您描述的错误。

在下面的:

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

您有一个指向矢量的指针,但是在尝试调用operator[]之前没有取消对该指针的引用。 然后,您尝试在索引0处取消对s_Astruct引用,但这不是指针。

尝试这个:

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

希望能有所帮助。

这让我发疯了-我设法得到了

std :: cout <<(nsNLs-> back())。name

工作,但我无法获得索引数组引用来工作(即使有了不需要的括号)。

std :: cout << ||在这里?|| nsNL ||此处?|| [intVal] ||这里?|| 名称

我尝试了围绕指向向量的指针进行解引用和括号化的所有方法,而没有涉及到(|||| passedVariable所指向的事物)[] .name

“。” 之所以起作用,是因为在两阶段取消引用的最后,我们正在查看该struct的实例,没有指向任何内容的东西,只是一个具体的内存块。

@Mark,非常清楚的解释,您可以进行一些有效的操作,而且操作异常,以至于使用矢量对象取消引用和数组元素/指针取消引用的括号时,我感觉更好。 我看到了您的解决方案,进行了尝试,并且成功了。

@Tomalek,您的答案是第二容易遵循的,并且在我的书中得到了加分,用于显示问题,逐步解决问题,解释错误并提出修复建议。 比Mark稍微运动,只有一组括号。

@ user470379,您的答案是正确的,并且显示了成功的解决方案,但是要遵循它有点困难,答案就在最后。

谢谢你们三个,我投票赞成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM