使用 c++ 中的构造函数时 ffi 的返回类型是什么

What's the return type of ffi when using a constructor function from c++

本文关键字:ffi 返回类型 是什么 构造函数 c++ 使用      更新时间:2023-10-16

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

我的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",但两者都会导致类型错误。我在谷歌上找到的所有结果都是关于LuaJIT而不是nodejs的。

如果没有返回类型,我们可以在Js中使用一个c++构造函数,它是可能的,我在Js中创建一个矩形对象?

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

我们可以这样写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': <Buffer@0x20397d8 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