如何在 C++ 中实例化 Octave classdef 对象并调用其方法

How to instantiate an Octave classdef object in C++ and call its methods

我知道如何使用 Octave 解释器和 feval 调用 .m 文件中定义的函数,如图 in the Octave manual 但不知道如何使用 Octave class es 及其方法。

如果我使用 classdef 方法在 Octave 中定义了一个简单的 class,例如

classdef TestClass < handle
  properties
    val
  endproperties
  methods
    function obj = TestClass()
      obj.val = 1;
    endfunction 
    function obj = setval(obj, v)
      obj.val = v;
    endfunction
    function showval(obj)
      disp(obj.val);
    endfunction  
  endmethods
endclassdef

如果我想在一些 C++ 代码中使用我的 class,我将如何去做。在 Octave 中它将是:

c = TestClass(); //create an instance of TestClass
c.setval(100); //use the objects methods
c.showval(); //display 100

解决方案

根据下面的答案,我将在这里展示我的解决方案。上面的octave代码可以改写为

c = TestClass();
setval(c, 100);
showval(c);

它可以变成这个 C++ 代码

#include <interpreter.h>
#include <parse.h>

int main()
{
    octave::interpreter interpreter;
    interpreter.execute();

    octave_value_list arg;
    octave_value c;
    
    c = octave::feval("TestClass", arg, 1).xelem(0);     

    arg(0) = c; 
    arg(1) = 100;
    octave::feval("setval", arg);  

    arg.clear(); 
    arg(0) = c;
    octave::feval("showval", arg);  

    return 0;
}

如果您已经知道如何从 C++ 调用 Octave 函数,那么您所缺少的只是 a.b()b(a) 相同。调用方法就像调用函数一样,没有区别。 Octave 根据输入参数找出要调用的函数重载。

您发布的 Octave 代码位,

c = TestClass();
c.setval(100);
c.showval();

也可以写成

c = TestClass();
setval(c, 100);
showval(c);