2016-08-19 14 views
14

Không thể dereference một con trỏ đến một đối tượng được lưu trữ trong một mảng bằng cách sử dụng toán tử indirection (dereference) hoặc tôi đang làm điều gì sai?Tại sao tôi không thể dereference một con trỏ đến một đối tượng đó là một phần tử mảng bằng cách sử dụng toán tử indirection?

#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; 
} 

Đây là lỗi tôi nhận được:

$ 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

là công việc này? * v [1] .test() – cutzero

+7

thử: '(* v [1]). test()' - phần tử mảng của nó mà bạn muốn dereference, không phải là giá trị trả về của 'test()'. – Galik

Trả lời

33

Theo Operator Precedence, operator. (toán tử truy cập thành viên) có độ ưu tiên cao hơn operator* (nhà điều hành gián tiếp/dereference), do đó *(v[1]).test(); tương đương với *((v[1]).test());, đó là không hợp lệ. (Bạn không thể gọi test() trên v[1] đó là A* qua opeartor..)

Thay đổi nó để

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

Hoặc sử dụng toán tử mũi tên làm trình biên dịch để gợi ý một cách hữu ích. – Kevin

+1

@Kevin Vâng, OP đã sử dụng nó trong 'v [0] -> test();', tôi nghĩ anh ta chỉ muốn biết cách sử dụng toán tử vô hướng để thực hiện nó. – songyuanyao

18

Cách đúng là thế này:

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

Tại đây bạn có chỉ số đầu tiên mảng và có được con trỏ (v[1]), sau đó bạn dereference con trỏ (*v[1]) và cuối cùng gọi phương thức theo giá trị đối tượng.

Trong ví dụ của bạn, trước tiên bạn đã cố gắng gọi test sử dụng . trên v[1], là con trỏ. Và chỉ sau đó bạn hủy đăng ký giá trị trả về của phương thức, điều này cũng vô nghĩa khi test trả về void.

Các vấn đề liên quan