2016-11-11 122 views
0

最近,我正在使用JavaScript中的C++函数,并且选择了nodejs的ffi插件。但我不知道如何编写JS中C++类构造函数的返回类型。使用C++构造函数时ffi的返回类型

我的C++代码看起来像这样

//definition of a class 
class Rectangle { 
    private: 
    int width, height; 

    public: 
    Rectangle (int,int); 
    int area(); 
    int perimeter(); 
}; 

//definition of member functions 
Rectangle::Rectangle (int a, int b) { 
     width = a; 
     height = b; 
} 

int Rectangle::area() { 
    return width * height; 
} 

int Rectangle::perimeter() { 
    return 2 * width + 2 * height; 
} 

我的js代码看起来像这样

//'use strict'; 

var ref = require('ref'); 
var ffi = require('ffi'); 
var Struct = require('ref-struct'); 

//define types 
var RectangleType = Struct({ 
    'x': 'int', 
    'y': 'int' 
}); 

var RectanglePtrType = ref.refType(RectangleType); 
var hw = ffi.Library('../build/libnotemplateLib', { 
     Rectangle:[/*what should I write here*/, ['int','int']] 
     }); 

console.log(hw.Rectangle(3,4)); 

我试图使用结构 “RectangleType” 和指针 “RectanglePtrType”,但它们都会导致类型错误。我在google中发现的所有结果都是关于LuaJIT,但不是nodejs。

如果在Js中没有可用于C++构造函数的返回类型,那么我有可能在JS中创建一个Rectangle对象吗?

+1

“编写一个C++类构造函数的返回类型“不存在构造函数的返回值。 – Rakete1111

+0

我看到我的教授做到了。我记得他首先将一个RectangleType结构作为一个容器,然后使用类似'ref()'的方式将容器的地址传递给构造函数。最后,调用构造函数时,它会更改容器的值。 –

回答

0

幸运的是,我今天找到了一个解决方案。

我们可以写我们的JS代码以这种方式

var hw = ffi.Library('../build/libnotemplateLib', { 
     Rectangle:[RectanglePtrType, [RectanglePtrType,'int','int']] 
     }); 

//usage of the constructor 
var d = new RectangleType(); 
hw.Rectangle(d.ref(), 2, 9); 
console.log(d); 
/* out put is a javascript object 
    { x: 2, 
    y: 9, 
    'ref.buffer': <[email protected] 02 00 00 00 09 00 00 00> }*/ 
console.log('C++ built rectangle area: ', hw.area(d.ref())); 
//output is 18 

如果任何人有类似的问题,因为我做的,想弄清楚我究竟怎么解决呢,欢迎您光临github.com/shenlin192/Projet-de-R-D