2016-11-11 126 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