2012-04-26 11 views
10

मेरे साथ तुलना करें क्योंकि मैं इसे समझाता हूं।एक जावास्क्रिप्ट कॉलबैक पर एक लिपटे सी ++ ऑब्जेक्ट को कैसे पास करें?

मैं सी ++ का उपयोग करके एक नोड.जेएस मॉड्यूल लिखने की कोशिश कर रहा हूं, जो libhdf5 से कुछ वर्गों को लपेटता है और उजागर करता है।

मैं वर्तमान में libhdf5 से दो कक्षाओं में रूचि रखता हूं। पहला वाला File है, और यह एक hdf5 फ़ाइल खोलता है। दूसरा एक Group है, और यह उस फ़ाइल के भीतर समूहों का प्रतिनिधित्व करता है। आपको फ़ाइल ऑब्जेक्ट से ग्रुप ऑब्जेक्ट मिलते हैं।

मैंने कुछ कोड लिखा है जिसमें मैं File ऑब्जेक्ट बनाता हूं और Group प्राप्त करने का प्रयास करता हूं। मैं अपने Node.js मॉड्यूल को जावास्क्रिप्ट के रूप में संभव बनाने की कोशिश कर रहा हूं, इसलिए मैं कॉलबैक का उपयोग कर समूह को वापस करना चाहता हूं। मेरी File आवरण के लिए सी ++ कोड में,

var hdf5 = require('hdf5'); 
var file = new hdf5.File('/tmp/example.h5'); 
file.getGroup('foobar', function (err, group) { console.log(group); }); 

तो मैं एक समारोह है कि यहाँ getGroup कार्य करने के लिए नक्शे होगा, है, और यह: तो, मैं अपने मॉड्यूल कोड करने के लिए इतना है कि यह इस तरह प्रयोग किया जाता है कोशिश कर रहा हूँ दिए गए अज्ञात फ़ंक्शन को कॉल करें, किसी भी त्रुटि में गुजरने के साथ-साथ नया Group ऑब्जेक्ट रैपर।

यह देखते हुए कि यह मुझे लगता है कि Node.js दस्तावेज़ factory of wrapped objects के रूप में दिखाता है, मैंने उदाहरण के बाद अपने Group कोड को मॉडल किया है।

तो, मेरे पास Group रैपर कोडेड किया गया है, लेकिन मैं इसे तुरंत चालू करने की कोशिश कर रहा हूं। मुझे फ़ंक्शन पैरामीटर के लिए v8 Arguments क्लास का उपयोग करने से दूर जाने के बारे में जानने के लिए अभी तक पर्याप्त जानकारी नहीं है। इसके कारण, मैं अपने v8 लगातार कन्स्ट्रक्टर फ़ंक्शन के लिए आवश्यक कुछ पैरामीटर में पास नहीं कर पा रहा हूं (क्योंकि मैं इसे सी ++ से तत्काल कर रहा हूं, और जेएस-जमीन से नहीं)।

क्या कोई my code for libhdf5 पर एक नज़र डालें और मुझे यह प्राप्त करने के लिए एक सूचक दें? मुझे लगता है कि मैं लगभग वहां हूं, लेकिन मुझे बस कुछ याद आ रहा है।

यहाँ, मेरी Group आवरण है निर्माता समारोह के साथ प्रकाश डाला: https://github.com/ryancole/node-hdf5/blob/master/src/h5_group.cc#L57-72

यहाँ मेरी File आवरण है, लाइन के साथ hightlighted जहां मैं अपने मानकों में पारित करने के लिए की आवश्यकता होगी तर्क के रूप में, (या जो भी यह है कि मैं करने की जरूरत है पाठ के इस दीवार को पढ़ने के लिए https://github.com/ryancole/node-hdf5/blob/master/src/h5_file.cc#L110

अग्रिम धन्यवाद, और धन्यवाद :)

उत्तर

9

आपने लगभग कर रहे हैं: यह काम करने के लिए करने के लिए इस बदल जाते हैं।। आपको Arguments से Group::Instantiate पास करने की आवश्यकता नहीं है। बस Group का नया उदाहरण बनाने के लिए आपको जो चाहिए उसे पास करें और कन्स्ट्रक्टर का उपयोग करें। उदाहरण के लिए:

Handle<Value> Group::Instantiate(const std::string& name) { 
    HandleScope scope; 

    Local<v8::Value> argv[1] = { 
     Local<v8::Value>::New(String::New(name.c_str())) 
    }; 

    return scope.Close(Constructor->NewInstance(1, argv)); 
} 

विधि Group::New शेष निर्माण कार्य करता है।

Handle<Value> Group::New(const Arguments& args) { 
    HandleScope scope; 

    if (!args[0]->IsString()) { 
     return ThrowException(Exception::TypeError(String::New("First argument must be a string"))); 
    } 
    const std::string name(*(String::Utf8Value(args[0]->ToString()))); 
    Group * const group = new Group(name); 
    bar->Wrap(args.This()); 

    return args.This(); 
} 

File::OpenGroup में आप यह कर सकते हैं:

Handle<Value> File::OpenGroup (const Arguments& args) { 
    HandleScope scope; 

    if (args.Length() != 2 || !args[0]->IsString() || !args[1]->IsFunction()) { 
     ThrowException(Exception::SyntaxError(String::New("expected name, callback"))); 
     return scope.Close(Undefined()); 
    } 
    const std::string name(*(String::Utf8Value(args[0]->ToString()))); 
    Local<Function> callback = Local<Function>::Cast(args[1]); 

    const unsigned argc = 2; 
    Local<Value> argv[argc] = { 
     Local<Value>::New(Null()), 
     Local<Value>::New(Group::Instantiate(name)) 
    }; 
    callback->Call(Context::GetCurrent()->Global(), argc, argv); 

    return scope.Close(Undefined()); 
} 

HTH

+0

कहना है कि आप एक कारखाने विधि ('समूह :: Instantiate') की जरूरत है कि एक और वर्ग का एक उदाहरण वापस जाने के लिए है ? – ZachB