2011-10-31 18 views
14

मेरे पास एक सी ++ प्रोग्राम है:सी ++। त्रुटि: शून्य पॉइंटर-टू-ऑब्जेक्ट प्रकार नहीं है

struct arguments 
{ 
    int a, b, c; 
    arguments(): a(3), b(6), c(9) {} 
}; 

class test_class{ 
    public: 

    void *member_func(void *args){ 
     arguments vars = (arguments *) (*args); //error: void is not a 
               //pointer-to-object type 

     std::cout << "\n" << vars.a << "\t" << vars.b << "\t" << vars.c << "\n"; 
    } 
}; 

संकलन पर यह एक त्रुटि फेंकता है:

error: ‘void*’ is not a pointer-to-object type 

क्या कोई यह समझा सकता है कि मैं इस त्रुटि को उत्पन्न करने के लिए क्या कर रहा हूं?

+0

हाँ, वहाँ है। क्या आपने एक और डेटाटाइप देने का प्रयास किया है? – Blender

+2

इस उदाहरण में आपके पास कोई "अमूर्त प्रकार" नहीं है (मुझे लगता है कि आप सार आधार वर्गों का मतलब है)। आप शायद '* (तर्क *) args' का मतलब है, जो' void * 'से' arguments * ', _then_ को संदर्भित करता है। आपका वर्तमान कोड 'शून्य * '(जो अवैध है) को अस्वीकार करने का प्रयास करता है, फिर अस्वीकृत मूल्य को' तर्क * 'पर डाला जाता है, जो लगभग निश्चित रूप से आपके इच्छित नहीं है। –

+0

@ क्रिस हाँ, यही वह है जो मैं करने की कोशिश कर रहा था, स्पष्टीकरण के लिए धन्यवाद। बीटीडब्ल्यू, मैंने सोचा कि structs और कक्षाओं को सार प्रकार के रूप में माना जाता था जबकि उदाहरण के लिए। int, फ्लोट गैर अमूर्त हैं। –

उत्तर

17

आप void * अपसंदर्भन कर रहे हैं - (के रूप में टिप्पणी में उल्लेख किया है जो भी बचा जाता है कॉपी-निर्माता): ऐसा करें: वैकल्पिक रूप से

arguments vars = *(arguments *) (args); 
std::cout << "\n" << vars.a << "\t" << vars.b << "\t" << vars.c << "\n"; 

, तो आप ऐसा कर सकते हैं एक ठोस प्रकार। क्योंकि संकलक लागू करने के लिए कैसे *args को (जो एक void * है और dereferenced नहीं किया जा सकता) पता नहीं है,

arguments vars = *(arguments *) (args); 

इस क्रम महत्वपूर्ण है: आप इसे दूसरी तरह के आसपास की ज़रूरत है। आपका (arguments *) बताता है कि क्या करना है, लेकिन यह बहुत देर हो चुकी है, क्योंकि अव्यवस्था पहले ही हो चुकी है।

+1

लेकिन कृपया यहां 'static_cast' का उपयोग करें - आपको एक बेहतर त्रुटि संदेश मिलेगा ... –

+0

@ बिली 'static_cast' क्या करता है? –

+1

@ मैट: सी सीमित शैली को छोड़कर, सी शैली के कलाकार के समान ही चीज़। 'static_cast'' कॉन्स्ट' को हटाने, किसी सूचक प्रकार की पुनरावृत्ति, और कुछ अन्य ग़लत चीज़ों को अस्वीकार करता है। आम तौर पर, कुछ भी जो 'static_cast' प्लेटफ़ॉर्म/आर्किटेक्चर में काम करेगा। अधिक जानकारी के लिए सी ++ मानक के सेक्शन 5.2.9 देखें (सी ++ 03 मानते हुए) –

3

आप गलत जगह पर * है। तो आप void* को अस्वीकार करने का प्रयास कर रहे हैं। करने के लिए इसे कास्टिंग से पहले

arguments *vars = (arguments *) (args); 
std::cout << "\n" << vars->a << "\t" << vars->b << "\t" << vars->c << "\n"; 
+0

इसे पॉइंटर के रूप में छोड़ना शायद बेहतर है, क्योंकि यह एक कॉपी कन्स्ट्रक्टर से बचाता है। हालांकि, ओपी को पॉइंटर (दोनों 'तर्क * 'और' शून्य * ')' const' बनाना चाहिए। –

0

* तर्क का अर्थ है "ऑब्जेक्ट (मान) अंक इंगित करता है"। इसलिए, इसे ऑब्जेक्ट (तर्क) के लिए पॉइंटर के रूप में नहीं डाला जा सकता है। यही कारण है कि यह उपरोक्त त्रुटि पुन: पेश करने त्रुटि

4

नंगे हड्डियों उदाहरण दे रहा है है:

#include <iostream> 
using namespace std; 
int main() { 
    int myint = 9;    //good 
    void *pointer_to_void;  //good 
    pointer_to_void = &myint; //good 

    cout << *pointer_to_void; //error: 'void*' is not a pointer-to-object type 
} 

ऊपर कोड गलत है, क्योंकि यह एक शून्य करने के लिए एक संकेतक भिन्नता की कोशिश कर रहा है। इसकी अनुमति नहीं है।

अब अगले कोड के नीचे चलाने के लिए, आप समझ क्यों निम्नलिखित कोड रन और इसके बाद के संस्करण कोड ऐसा नहीं करता है, तो आप बेहतर समझने के लिए क्या हुड के नीचे चल रहा है सुसज्जित किया जाएगा।

#include <iostream> 
using namespace std; 
int main() { 
    int myint = 9; 
    void *pointer_to_void; 
    int *pointer_to_int; 
    pointer_to_void = &myint; 
    pointer_to_int = (int *) pointer_to_void; 

    cout << *pointer_to_int; //prints '9' 
    return 0; 
} 
0

bdonlan के रूप में समस्या कहा जाता है कि "कास्टिंग से पहले void* अपसंदर्भन"।

मुझे लगता है कि इस उदाहरण में मदद मिलेगी:

#include <iostream> 

using namespace std; 

int main() 
{ 



    void *sad; 
    int s = 23; 
    float d = 5.8; 

    sad = &s; 
    cout << *(int*) sad;//outputs 23//wrong: cout << *sad ;//wrong: cout << (int*) *sad; 



    sad = &d; 
    cout << *(float *) sad;//outputs 5.8//wrong: cout << *sad ;//wrong: cout << (float*) *sad; 

    return 0; 
} 
संबंधित मुद्दे