Как создать экземпляр объекта Octave classdef в C и вызвать его методы

#c #octave

Вопрос:

Я знаю, как вызвать функцию, определенную в файле .m, с помощью интерпретатора Октавы и feval , как показано в руководстве по Октаве, но не знаю, как сделать что-то подобное, используя классы Октавы и их методы.

Если у меня есть простой класс, определенный в Октаве с помощью метода classdef, например

 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 , как бы я это сделал. В октаве это было бы:

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

Решение

Основываясь на ответе ниже, я представлю свое решение здесь. Приведенный выше октавный код может быть переписан следующим образом

 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;
}
 

Ответ №1:

Если вы уже знаете, как вызвать функцию Октавы из C , то все, чего вам не хватает, — это то a.b() же b(a) самое, что и . Вызов метода аналогичен вызову функции, здесь нет никакого различия. Октава определяет, какую перегрузку функции вызывать, основываясь на входных аргументах.

Фрагмент кода Октавы, который вы опубликовали,

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

также может быть записано как

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