2016-08-19 16 views
14

간접 참조 (역 참조) 연산자를 사용하여 배열에 저장된 객체에 대한 포인터를 역 참조 할 수 없습니까? 아니면 내가 잘못하고 있습니까? 다음을간접 참조 연산자를 사용하여 배열 요소 인 객체에 대한 포인터를 역 참조 할 수없는 이유는 무엇입니까?

여기
(*v[1]).test(); 

먼저 인덱스 배열 및 포인터 (v[1])를 얻을 :

$ g++ -std=c++11 test.cpp && ./a.out 
test.cpp: In function ‘int main()’: 
test.cpp:26:13: error: request for member ‘test’ in ‘v[1]’, which is of 
pointer type ‘A*’ (maybe you meant to use ‘->’ ?) 
    *(v[1]).test(); 
+0

변경이이 작업은? test()'-'test()'의 반환 값이 아닌, 참조를 취소하고자하는 배열 요소입니다. * v [1] .test() – cutzero

+7

try :'(* v [1]). – Galik

답변

33

Operator Precedence에 따르면 operator. (멤버 액세스 연산자) operator* (간접/참조 연산자)보다 높은 우선 순위를 가지므로 *(v[1]).test(); 유효하지 않다 *((v[1]).test()); 동일하다. (당신은 opeartor.를 통해 A*입니다 v[1]test()를 호출 할 수 없습니다.)

(*v[1]).test(); 
+0

또는 화살표 연산자를 컴파일러로 사용하여 유용하게 제안합니다. – Kevin

+1

@Kevin 글쎄요, OP는'v [0] -> test();'에서 OP를 사용했습니다, 나는 그가 단지 그것을 수행하기 위해 간접 연산자를 사용하는 방법을 알고 싶어한다고 생각합니다. – songyuanyao

18

적절한 방법이 있습니다 : 여기

#include <iostream> 

class A { 
    public: 
     virtual void test() { 
      std::cout << "A\n"; 
     } 
}; 

class B : public A { 
    public: 
     void test() { 
      std::cout << "B\n"; 
     } 
}; 


int main() { 
    A* v[2]; 

    v[0] = new A(); 
    v[1] = new B(); 

    v[0]->test(); 
    *(v[1]).test(); // Error! If the arrow operator is used instead 
        // though, the code compiles without a problem. 

    return 0; 
} 

오류가 나는 얻을 수있다 포인터를 참조 해제하고 (*v[1]) 마지막으로 객체 값으로 메소드를 호출하십시오.

예를 들어 을 v[1]에있는 .을 포인터로 사용하여 먼저 호출하려고했습니다. 그리고 그 후에 만 ​​메서드의 반환 값을 역 참조합니다. 이는 test이 void를 반환하므로 의미가 없습니다.