2016-08-19 7 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

変更それがこの作品はありますか? test() ' - ' test() 'の戻り値ではなく、参照を外す配列要素です。* v [1] .test() – cutzero

+7

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

答えて

33

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

適切な方法はこれです:

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

ここで最初のインデックスの配列とポインタ(v[1])を取得し、あなたポインタを逆参照し(*v[1])、最後にメソッドをオブジェクト値で呼び出します。

あなたの例では、最初にをの.をポインタとして使用して呼び出しようとしました。それ以降は、メソッドの戻り値を逆参照しました。これはまた、testがvoidを返すので意味がありません。 Operator Precedenceによれば

関連する問題