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

कोशिश करें: '(* वी [1])। परीक्षण()' - यह सरणी तत्व जिसे आप अपमान करना चाहते हैं, न कि 'test() 'का वापसी मूल्य। – Galik

उत्तर

33

Operator Precedence के अनुसार, operator. (सदस्य पहुँच ऑपरेटर) operator* (अविवेक/भिन्नता ऑपरेटर) की तुलना में अधिक पूर्वता है, तो *(v[1]).test(); बराबर *((v[1]).test()); है, जो मान्य नहीं है। (आप v[1] जो opeartor. के माध्यम से A* है पर test() फोन नहीं कर सकते हैं।)

यह

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

या तीर ऑपरेटर का उपयोग संकलक के रूप में करें ताकि मददगार तरीके से सुझाव दिया जा सके। – Kevin

+1

@ केविन वेल, ओपी ने इसे 'वी [0] -> टेस्ट() में इस्तेमाल किया है,' मुझे लगता है कि वह सिर्फ यह जानना चाहता है कि इसे पूरा करने के लिए इंडिकेटर ऑपरेटर का उपयोग कैसे करें। – songyuanyao

18

उचित तरीके से यह है:

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

यहाँ आप पहले सूचकांक सरणी और सूचक (v[1]) मिलता है, तो आप पॉइंटर (*v[1]) को डिफरेंस करें और अंततः ऑब्जेक्ट वैल्यू द्वारा विधि को कॉल करें।

आपके उदाहरण में आपने पर का उपयोग करके test पर कॉल करने का प्रयास किया, जो एक सूचक है। और उसके बाद ही आपने विधि के वापसी मूल्य को संदर्भित किया, जो कि test के रूप में भी बकवास शून्य है।

संबंधित मुद्दे

 संबंधित मुद्दे