2013-06-04 33 views
-1

我似乎無法管理訪問矢量元素的語法,其指針包含在結構中。更多的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(),它不是對我來說,因爲我不希望範圍檢查的開銷。這是性能關鍵代碼的一部分。

回答

3

A.X[0]嘗試訪問由X指向的第一個向量 - 請記住,它是一個指針。

要在矢量本身上使用operator[],您可以使用A.X->operator[](0),儘管老實說,我沒有看到您的成員是指針而不是對象的原因。

您的代碼exibits不確定的行爲,因爲X是一個未初始化的指針

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

這裏。

+0

A.X-> operator [](0),起作用。謝謝。它是一個指針,因爲在我的應用程序中,它與其他事物一起被封裝在一個結構中。使用vect的要點是它是可變大小的,所以我不能把它放在結構體的中間。哦,我忘了在MWE中初始化它。在我的代碼中,我正確地初始化它。我編輯了上面的MWE。 – Timtro

5

A.X是指針。您需要取消引用它來訪問它指向的矢量:

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

但是,如果你還沒有初始化A.X指向任何東西,提領它不確定的行爲,它看起來像你在這個方案有。

+0

謝謝。我忘記了初始化的路線,但這只是MWE中的一個疏漏。問題依然存在。您提供的修改在'** A.vectag :: X''中給出'不匹配'運算符''的錯誤 – Timtro