主要内容

生成c++类MATLAB

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

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

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

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

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

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

定义一个MATLAB句柄类MyClass

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

定义MATLAB函数喷火使用MyClass

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

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

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

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

class MyClass {public: MyClass *init(double value);空白publicMethod(双精度值);static double doubleThisValue(double val);双calculateSomeValue()常量;双publicProp;私人:双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 =;obj - > publicProp = 1.0;obj - > privateProp =价值;返回obj;}

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

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

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

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

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

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

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

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

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

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

class MyClass {public: MyClass *init(double value);空白publicMethod(双精度值);static double doubleThisValue(double val);双calculateSomeValue()常量;双publicProp;私人:双privateProp;};

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

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

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

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

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

static double doubleThisValue(double val);

属性标记不改变对象的方法常量限定符。

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

双calculateSomeValue()常量;

附加的使用说明和限制

以下是一些从MATLAB类生成c++类的额外使用注意事项和限制:

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

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

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

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

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

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

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

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

另请参阅

||

相关的话题