Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript C++;级别节点JS模块加载_Javascript_C++_Node.js_V8_Node Modules - Fatal编程技术网

Javascript C++;级别节点JS模块加载

Javascript C++;级别节点JS模块加载,javascript,c++,node.js,v8,node-modules,Javascript,C++,Node.js,V8,Node Modules,我正在开发一个NodeJS模块,它的文件大小正在急剧增加,但是我意识到我可以将我的模块分为两个独立的模块。当这种情况发生时,第二个模块中只有几个函数需要使用我的第一个模块的内部C++类。是否有可能只将第一个模块的原型传递给第二个模块 例如: 模块A: 有一个名为cModuleA的类: class cModuleA { //declarations data* pointer; } 模块B: 有大约100个函数,但其中只有一个需要操作数据*指针。它还需要返回cModuleA对象(

我正在开发一个NodeJS模块,它的文件大小正在急剧增加,但是我意识到我可以将我的模块分为两个独立的模块。当这种情况发生时,第二个模块中只有几个函数需要使用我的第一个模块的内部C++类。是否有可能只将第一个模块的原型传递给第二个模块

例如:

模块A: 有一个名为
cModuleA
的类:

class cModuleA {
    //declarations
    data* pointer;
}
模块B: 有大约100个函数,但其中只有一个需要操作
数据*
指针。它还需要返回
cModuleA
对象(因此它需要
cModuleA
的原型或了解
cModuleA
实现)


我尝试从第一个模块导出符号(<代码> dLimPurt/DLReuts< /Copy>在Windows中),但我只是想知道是否有更好的选项来注入依赖于C++的级别。

< P>我找到了解决这个问题的方法,我将详细地讨论它,因为可能没有人尝试过这么疯狂的事情了。p> 假设您有两个本机节点模块。这意味着它们位于单独的可执行文件(.node)中。其中一个是moduleA,另一个是moduleB:

模块a

class cppClass
{
public:
    cppClass();
    ~cppClass();
    // C++ stuff here
}; // !class cppClass

class cppClassWrap
    : public node::ObjectWrap
{
public:
    // used for initializing this class for Node/v8
    static void Initialize(v8::Handle<Object> target);
    // internal C++ data accessor
    cppClass* GetWrapped() const { return internal_; };
    // internal C++ data accessor
    void SetWrapped(cppClass* n)  { internal_ = n; };
private:
    cppClassWrap();
    cppClassWrap(cppClass*);
    ~cppClassWrap() { if (internal_) delete internal_; };

    // JS stuff here

    static Persistent<Function> constructor;
    // JS c'tor
    static NAN_METHOD(New);
    // internal C++ data
    cppClass* internal_;
}; // !class cppClassWrap

//-------------------------------------------------
// JS c'tor implementation
NAN_METHOD(cppClassWrap::New)
{
    NanScope();
    cppClassWrap* obj;
    if (args.Length() == 0)
    {
        obj = new cppClass();
    }
    // **** NOTICE THIS! ****
    // This is a special case when in JS land we initialize our class like: new cppClassWrap(null)
    // It constructs the object with a pointer, pointing to nothing!
    else if (args[0]->IsNull())
    {
        obj = new cppClass(nullptr);
    }
    else
    {
        //copy constructor for the JS side
        obj = new cppClassWrap(ObjectWrap::Unwrap<cppClassWrap>(args[0]->ToObject())->GetWrapped());
    }
    obj->Wrap(args.This());
    NanReturnValue(args.This());
}

完成了!你有模块注入在C++级别! 检查@ToddMoses在这种情况下,
Foo
NeedFoo
都在同一个包中(也就是说,它们知道彼此的实现),但这里我有另一个二进制文件中的
模块A
和另一个二进制文件中的
模块B
var cppClassWrap = require("ModuleA.node").cppClassWrap;
var moduleB = require("ModuleB.node").dependencies({
    "moduleA" : function() {return new cppClassWrap(null); }
});