2016-08-19 21 views
14

是不可能使用间接(取消引用)运算符取消引用存储在数组中的对象的指针,还是我做错了什么?为什么我不能使用间接运算符将指针取消引用一个数组元素的对象?

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

以下是错误我得到:

$ 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

是这项工作? *(1).test() – cutzero

+7

尝试:'(* v [1])。test()' - 你想要解引用的数组元素,而不是'test()'的返回值。 – Galik

回答

33

按照Operator Precedenceoperator.(成员访问运算符)具有比operator*(间接/引用操作)更高的优先级,所以*(v[1]).test();相当于*((v[1]).test());,这是无效的。 (您不能调用v[1]这是通过opeartor.A*test()。)

将其更改为

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

或者使用箭头运算符作为编译器,以帮助建议。 – Kevin

+1

@Kevin嗯,OP已经在'v [0] - > test();'中使用了它,'我想他只是想知道如何使用间接运算符来完成它。 – songyuanyao

18

正确的方法是这样的:

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

在这里,你第一个索引阵列和得到的指针(v[1]),那么你取消引用指针(*v[1]),最后通过对象值调用方法。

在您的示例中,您首先尝试使用.v[1],这是一个指针)调用test。只有在这之后,您才会取消该方法的返回值,这也是无稽之谈,因为test返回void。

相关问题