[英]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.