2013-06-04 5 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]; 줄에서 B.X [0]은 올바른 IF X가 포인터가 아닐 것입니다 (회수, std::vector<float> *X;). X의 요소에 액세스 할 수 있도록 operator [] 앞에 X를 역 참조하는 올바른 구문은 무엇입니까?

P. 멤버 함수 at()을 알고 있으며,에 대한 옵션이 아닙니다. 범위 검사의 오버 헤드를 원하지 않기 때문입니다. 이는 성능에 중요한 코드의 일부입니다.

답변

3

A.X[0]X이 가리키는 첫 번째 벡터에 액세스하려고 시도합니다. 이는 기억해 둡니다.

벡터 자체에서 operator[]을 사용하려면 A.X->operator[](0)을 사용할 수 있습니다. 멤버가 포인터가 아닌 객체 인 이유를 알 수는 없지만 실제로 사용할 수는 있습니다. X가 초기화되지 포인터 여기

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

때문에

코드는 정의되지 않은 동작을 exibits.

+0

A.X-> operator [] (0), 작동합니다. 감사. 그것은 내 응용 프로그램에서 구조체에 다른 것들이 들어 있기 때문에 포인터입니다. vect 사용의 요점은 가변 크기이므로 구조체의 중간에 가질 수 없다는 것입니다. 아, 그리고 MWE에서 초기화하는 것을 잊어 버렸습니다. 내 코드에서는 올바르게 초기화합니다. 위의 MWE를 편집했습니다. – Timtro

5

A.X이 포인터입니다. 당신은 그것이 가리키는 벡터에 액세스하는 역 참조 할 필요가 :

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

을하지만 A.X를 초기화하지 않은 경우 당신이이 프로그램에 가지고있는 것처럼 보이는 행동을 정의되지 않은 한 역 참조, 무엇을 가리 키도록.

+0

감사. 나는 회선을 초기화하는 것을 잊어 버렸지 만, 그것은 단지 MWE에서의 누락이었다. 문제는 여전히 남아 있습니다. 입력 한 수정 내용은 '** A.vectag :: X'의 'operator'에 대한 'no match'오류를 제공합니다. – Timtro