在operator []之前取消引用成员指针

时间:2013-06-04 20:32:10

标签: c++ stdvector dereference

我似乎无法管理访问向量元素的语法,其指针包含在结构中。 MWE之后的更多内容:

#include <vector>
#include <stdio.h>

typedef struct vectag
  {
    std::vector<float> *X;
  } vec;

int main ()
  {
    vec A;
    A.X = new std::vector<float>(0);

    A.X->push_back(5.0);

    // This next line is the problem:
    float C = A.X[0];

    printf("%f\n", C);
    return 1;
  }

GCC(G ++)说

14:24: error: cannot convert ‘std::vector<float>’ to ‘float’ in initialization

当然,这是对的。在行float C = A.X[0];中,如果X不是指针(回忆,std::vector<float> *X;),则B.X [0]将是正确的。 在operator []之前解除引用X的正确语法是什么,以便我可以访问X?

的元素

P.S。 我知道成员函数at(),它不是的选项因为我不想要范围检查的开销。这是性能关键代码的一部分。

2 个答案:

答案 0 :(得分:5)

A.X是指针。您需要取消引用它以访问它指向的向量:

float C = (*A.X)[0];

但是如果你没有初始化A.X指向任何东西,解除引用它有未定义的行为,它在你看来就像你在这个程序中。

答案 1 :(得分:3)

A.X[0]尝试访问X指向的第一个向量 - 记住,这是一个指针。

要在向量本身上使用operator[],您可以使用A.X->operator[](0),但老实说,我没有看到您的成员是指针而不是对象的原因。

您的代码会显示未定义的行为,因为X是一个统一指针

vec A;
A.X->push_back(5.0);

这里。