首页 > 解决方案 > 将 C++ 类引入 Octave

问题描述

我浏览了网络,并没有找到关于如何将 C++ 类引入 Octave 的正确介绍。我想做的是

C++:

class Foo
{
public:
    Foo(int n) {...}
    ~Foo() {...}
    void Print() {...}
};

八度:

> foo = Foo(9);
> foo.Print();

另外,我还想了解在 C++ 代码中读入 Octave 向量、矩阵(2-way integration)。

标签: c++octave

解决方案


您的问题中有几件事是后备词,对我而言,这意味着您对八度音程(特别是八度音程-C++ 接口)的工作方式有某些假设,但这些假设不适用。

例如,如果您执行“Foo(9)”,则以八度音阶形式生成的对象是什么?它是一个八度音程对象吗?当然不是; 没有理由 c++ 类与 octave 类相同(假设 octave 开发人员已经费尽心思使 octave 对象与 c++ 对象完全兼容,这将是一个相当大的假设——这是一项如此艰巨的任务,没有其他语言已经尝试过了)。

其次,即使您确实设法以某种方式在八度音程中创建了 C++ 对象的表示形式……它在内存中的什么位置,以及它的功能如何运作?C++ 是编译的静态语言,octave 是解释的动态语言。因此,实际上,将 c++ 类“导入”到 octave 的问题并没有您想象的那么有意义。

应该问的是,是否有一个接口允许您使用 C++ 类进行操作,以八度为单位。

答案是肯定的。有点。“专门”没有 c++ 类的接口,但一般来说有一个 c++ 接口。

因此,根据您希望如何在 octave 中使用 c++ 类对象,您可以使用 octave-c++ 接口为您的 c++ 类的功能创建合适的 API。

例如,如果您需要在 octave 中拥有某种“对象”,它具有可以调用的方法,那么一个明显的选择是创建一个octave类,并简单地确保其方法被委托给 .oct /.mex 文件(编译后的 c++ 代码)。

如果你坚持所谓的八度面向对象编程的“旧风格”(我实际上更喜欢),那么这就像用 .oct 文件替换“@”文件夹中的函数文件一样简单(好吧,理论上,如果你愿意,你也可以使用新的 'classdef' 样式来做到这一点:p)。

这也意味着,由于 octave 方法隐式传递 octave 对象,因此您的 C++ 接口必须在 c++ 代码中重新创建 C++ 等效对象,然后执行适当的方法调用并返回结果(这可能是一个新的c++ 对象,然后将其转换为 octave 对象,并返回该对象,以表示更改的状态)。

或者,如果您只需要在 c++ 环境中“在后台”使用一些 c++ 类函数,但从八度音程的角度来看,您真正关心的是传递一些“初始化”参数,并返回结果, 那么你根本不需要一个 octave 对象,你所需要的只是一个简单的基于 .oct 的函数,它接受一些(初始化)参数,将它们传递给 c++ 接口,然后简单地“发生”在下面使用 c++ 类在将值返回到您的 octave 工作区之前的引擎盖。


PS。我没有在您的问题中谈论“矢量接口”附录,因为正如 Cris 所提到的那样,文档中对此进行了合理的深度介绍。如果有兴趣,请特别参阅https://octave.org/doc/v6.3.0/Matrices-and-Arrays-in-Oct_002dFiles.html#Matrices-and-Arrays-in-Oct_002dFiles 。完整的 C++ API 位于:https ://octave.org/doxygen/stable/


推荐阅读