主要内容

生成c++类MATLAB

生成c++代码时,代码生成器的默认行为为MATLAB中的类生成c++类®代码。这些包括所有的MATLAB类,如值类、句柄类和系统对象。

您可以更改代码生成器的默认行为,以生成MATLAB类的结构。要更改默认行为,请执行以下操作之一:

  • 在代码配置对象中,设置TargetLang“c++”而且CppPreserveClasses

  • MATLAB编码器™应用程序,在生成一步,设置语言c++.的项目生成设置中代码的外观选项卡,清除从MATLAB类生成c++类复选框。

这些例子说明了代码生成器在将MATLAB类映射到c++类时遵循的某些规则。

示例:为拥有私有和公共成员的句柄类生成代码

定义一个MATLAB句柄类MyClass

classdefMyClass < handle属性publicProp = 1;结束属性(Access = private) privateProp结束方法函数obj = MyClass(value) obj。privateProp = value;结束函数publicMethod (obj,值)obj.privateMethod(价值);结束函数res = calculateSomeValue(obj) res = obj. publicprop *obj. privateprop;结束结束方法(Access = private)函数privateMethod (obj,价值)obj。publicProp = obj。publicProp + value;obj。privateProp = obj。privateProp + obj.doubleThisValue(value);结束结束方法(静态)函数res = doubleThisValue(val) res = 2 * val;结束结束结束

定义一个MATLAB函数喷火使用MyClass

函数out = foo(x,y) obj = MyClass(x);obj.publicMethod (y);out = obj.calculateSomeValue;结束

生成一个静态c++库喷火.将输入参数指定为双标量。设置代码生成配置属性InlineBetweenUserFunctions“可读性”

CFG = code .config(“自由”);cfg。TargetLang =“c++”;cfg。InlineBetweenUserFunctions =“可读性”;codegen配置cfg喷火arg游戏{0}报告
代码生成成功:查看报告

打开代码生成报告并检查生成的代码。该文件MyClass.h包含生成的c++类的定义MyClass

class MyClass {public: MyClass *init(double value);void publicMethod(double value);static double doubleThisValue(double val);const;双publicProp;private: double privateProp;};

这是为函数生成的代码喷火

double foo(double x, double y) {MyClass obj;obj.init (x);obj.publicMethod (y);返回obj.calculateSomeValue ();}

该表列出了代码生成器在生成c++类时遵循的一些规则,以及从所生成的代码中生成相应的代码段MyClass

规则 代码片段

MATLAB中的类构造函数映射到初始化方法。类的实例创建时,生成的代码显式调用初始化方法。

该文件MyClass.cpp包含的定义初始化

MyClass *MyClass::init(double value) {MyClass *obj;Obj = this;obj->publicProp = 1.0;obj->privateProp = value;返回obj;}

在大多数情况下,如果一个类成员在MATLAB中被设置为私有,那么在生成的c++代码中它也会被设置为私有。

在某些情况下,在生成的c++代码中内联一个公共方法会将MATLAB代码中的私有属性更改为生成的代码中的公共属性,并破坏数据封装。例如,假设一个公共方法myMethod它使用私有财产道具对象的函数由入口点函数调用。如果myMethod是否内联在生成的代码中,属性道具必须从对象外部可见,并更改为公共属性。

为了限制这种情况的发生,代码生成器在这种情况下对公共方法使用了特殊的内联规则:

  • 如果代码配置属性InlineBetweenUserFunctions或等效的代码生成设置用户函数之间的内联MATLAB编码器App设置为“可读性”,代码生成器不会内联出现在类定义之外的公共方法调用。

在这些情况下,同样的内联规则适用于普通函数和公共方法:

  • 函数或方法的主体包含显式coder.inline(总是)coder.inline(“不”)指令。这个指令的优先级最高。

  • 您可以设置代码配置属性InlineBetweenUserFunctions或等效的代码生成设置用户函数之间的内联MATLAB编码器应用“永远”“速度”,或“总是”

  • 对一个方法的调用出现在同一类的另一个方法中。

看到控制内联以优化生成代码的性能和可读性

生成的c++类的定义MyClass是:

class MyClass {public: MyClass *init(double value);void publicMethod(double value);static double doubleThisValue(double val);const;双publicProp;private: double privateProp;};

所有数据和成员函数在MATLAB和生成的代码之间保持可见性。

私有方法privateMethod在这个定义中没有出现。privateMethod的定义中是否内联publicMethod(见文件MyClass.cpp):

void MyClass::publicMethod(double value) {this->publicProp += value;this->privateProp += MyClass::doubleThisValue((value));}

MATLAB中的静态方法映射到静态c++方法。

为静态方法生成的代码doubleThisValue有这样的签名:

static double doubleThisValue(double val);

方法标记不改变对象的方法常量生成的代码中的限定符。

公共方法calculateSomeValue不改变对象。生成的方法有这样的签名:

const;

其他使用说明和限制

下面是一些从MATLAB类生成c++类的附加用法注意事项和限制:

  • 的类原型MyClass包含在头文件中MyClass.h.该类方法的实现包含在文件中MyClass.cpp

  • 在生成的代码中,类层次结构是扁平的。例如,假设在你的MATLAB代码中,类B从类继承一个.在生成的c++代码中,类B而且一个他们之间没有继承关系。在生成的代码中,类的所有属性和方法一个在阶级的定义中是再现的吗B

  • 当MATLAB类的属性使用不同的类型时,代码生成器会为每种类型的使用生成一个单独的c++类。

  • 如果MATLAB类成员有不同的GetAccess而且SetAccess属性时,生成的类的对应成员具有两个属性中更允许的一个。例如,如果一个属性道具具有属性(GetAccess = public, SetAccess = private)道具在生成的代码中定义为公共属性。

  • 在尝试为MATLAB类生成包含c++类的独立代码时,如果这两个条件都为真,您可能会得到一条警告消息:

    • 方法来生成可重入代码MultiInstanceCode参数,或通过启用生成可重入代码参数中的MATLAB编码器应用程序。

    • MATLAB代码中类的析构函数有一个持久变量,或者调用另一个声明并使用持久变量的函数。

    在这种情况下,要为MATLAB类生成包含c++类的代码,请禁用MultiInstanceCode或者是生成可重入代码参数。

另请参阅

||

相关的话题