2016-08-19 61 views
14

Dolaylı (dereference) operatörünü kullanarak bir dizide saklanan bir nesneye bir işaretçiyi işaret etmek ya da yanlış bir şey mi yapıyorum? o zaman,Neden dolaylı işleç kullanan bir dizi öğesi olan bir nesneye bir işaretçi gösteremiyorum?

İşte
(*v[1]).test(); 

ilk endeks dizisi ve işaretçi (v[1]) olsun:

$ 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

için

Değişim bu iştir? * v [1] .test() – cutzero

+7

deneyin: '(* v [1]). test()' - dizgesini dizgeye almak istediğiniz değil, 'test()' dönüş değeri. – Galik

cevap

33

Operator Precedence göre, operator. (üye ile erişim operatörü) operator* (doğru olmayan/KQUEUE operatörü) daha yüksek önceliğe sahiptir, bu yüzden *(v[1]).test(); geçerli olmadığı, *((v[1]).test()); eşdeğerdir. (Sen opeartor. aracılığıyla A* olduğunu v[1] üzerinde test() arayamam.)

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

Veya okuyucuyu derleyici olarak kullanın, o kadar yardımcı olur. – Kevin

+1

@Kevin Eh, OP bunu v [0] -> test(); 'de kullandı, bence bunu gerçekleştirmek için dolaylı işletmeciyi nasıl kullanacağını bilmek istiyor. – songyuanyao

18

uygun yolu şudur: Burada

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

hata alıyorum edilir işaretçi işaretçisi (*v[1]) ve son olarak yöntemi nesne değerine göre çağır.

Örneğinizde, bir işaretçi olan v[1]'da . kullanarak test numaralı telefonu aramayı denediniz. Ve ancak bundan sonra, yöntemin dönüş değerini kestirdiniz, ki bu da test no'lu ifadeyle geçersizdir.