2012-01-16 6 views
5

मैं है C++ निम्नलिखित कोड लौटा:नेमस्पेस को मिला जब वर्ग विधि से scoped enum

BOOST_PYTHON_MODULE(TestPython) 
{ 
    scope the_scope = class_<Person>("Person") 
     .def("GetGender", &Person::GetGender); 

    enum_<Person::Gender>("Gender") 
     .value(Male, Person::Male) 
     .value(Female, Person::Female) 
     .export_values(); 
} 

जब मैं कोशिश:

class Person 
{ 
    public: 
     enum Gender {Male, Female}; 

     Gender GetGender() const; 
} 

मैं इसे बढ़ावा में :: अजगर इस तरह से लिपटे अजगर से person.GetGender() कॉल करने के लिए मैं निम्नलिखित अपवाद:

 
Can't pickle : attribute lookup **PyBF.TestPython.Gender**. 
It guesses the namespace of the Gender (which is actually **PyBF.TestPython.Person.Gender**) enum return type incorrectly. 

मैं कैसे GetGender funct बता सकते हैं आयन किस प्रकार स्पष्ट रूप से वापस आना है?

+2

enums के अचार के साथ कुछ अजीबता है। यहां देखें: http://stackoverflow.com/questions/3214969/ –

उत्तर

1

जब से हम कोड है कि त्रुटि पैदा करता है की जरूरत नहीं है, मैं यह तब होता है जब आप एक व्यक्ति वस्तु अचार करने की कोशिश मान।

आपकी समस्या विशेष रूप से बढ़ावा के उपयोग से संबंधित नहीं है। यह सीपीकल मॉड्यूल में निहित है। इसमें नेस्टेड कक्षाओं के साथ समस्या पिकलिंग ऑब्जेक्ट है। स्पष्टीकरण के लिए यह answer देखें। यहाँ एक सरल कोड उदाहरण है कि त्रुटि पैदा करता है:

import cPickle 

class MyOuterClass(object): 
    class MyInnerClass(object): 
     pass 

    def __init__(self): 
     self.my_inner_class = self.MyInnerClass() 


def pickle_error(): 
    print "Pickling ..." 
    my_outer_class = MyOuterClass() 
    print cPickle.dumps(my_outer_class) 

if __name__ == "__main__": 
    pickle_error() 

चल रहा है यह इस उत्पादन का उत्पादन:

Pickling ... 
Traceback (most recent call last): 
    File "pickle.py", line 18, in <module> 
    pickle_error() 
    File "pickle.py", line 15, in pickle_error 
    print cPickle.dumps(my_outer_class) 
cPickle.PicklingError: Can't pickle <class '__main__.MyInnerClass'>: 
attribute lookup __main__.MyInnerClass failed 

जुड़ा हुआ जवाब में उल्लेख किया है, जब cPickle यह रिटर्न '__main__.MyInnerClass' जैसा कि इसके नाम के लिए भीतरी वर्ग पूछता है। हालांकि, यह नाम मॉड्यूल के नामस्थान में नहीं पाया जा सकता है, इसलिए आपको अपवाद मिलता है।


अब आप इस अनुभव क्योंकि के बाद से वहाँ अजगर में एक enum प्रकार के समान किसी चीज़ नहीं है, को बढ़ावा देने के लिए यह प्रतिनिधित्व करने के लिए एक वस्तु बना सकते हैं। Enum_ निर्माण वर्तमान दायरे में एक वर्ग की घोषणा करता है। कक्षा के दायरे को पकड़कर, आप व्यक्ति के भीतर एक घोंसला वर्ग बनाते हैं और आपको ऊपर वर्णित अचार त्रुटि मिलती है।

आपकी समस्या के कुछ समाधान हैं।

सबसे आसान व्यक्ति के दायरे के बाहर enum घोषित करना होगा। आप कोड संगठन के लिए इसके अलावा किसी व्यक्ति के संबंधित enum का पर्दाफाश नहीं करना चाहेंगे। इसके बाद आप एक उप मॉड्यूल में व्यक्ति वर्ग घोषित कर सकते हैं ताकि आपका enum कुछ भी सार्वजनिक रूप से बिना आपकी कक्षा के करीब घोषित किया जा सके।

आप boost's pickle support पर भी एक नज़र डाल सकते हैं। हालांकि मैंने कोशिश नहीं की है।

एक ऑब्जेक्ट आपके ऑब्जेक्ट को स्टोर करने के लिए अचार की तुलना में कुछ और उपयोग करने के लिए हो सकता है।

1

क्या यह संभव है कि आपके पास कोई अन्य पुरुष है, महिला कहीं परिभाषित है? अन्यथा मैं नहीं देखता कि यह कैसे संकलित करता है। वर्ग गुंजाइश जोड़ने का प्रयास करें:

enum_<Person::Gender>("Gender") 
    .EXPORT_ENUM_VALUE(Person::Male) 
    .EXPORT_ENUM_VALUE(Person::Female) 
    .export_values(); 
+0

क्षमा करें मैंने पोस्ट को अपडेट किया है, मैंने पूरी तरह से अपना कोड कॉपी नहीं किया है, उम्मीद है कि अब यह और अधिक समझ में आता है – Grim

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