主要内容

生成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)obj.privateProp=value;结束作用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.inlinebetweenUserFunction=“可读性”; 编码基因配置cfg喷火arg游戏{0}-报告
代码生成成功:查看报告

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

类MyClass{public:MyClass*init(双值);void publicMethod(双值);静态双double doubleThisValue(双值);double CalculateMeValue()常量;double 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(双值){MyClass*obj;obj=this;obj->publicProp=1.0;obj->privateProp=value;返回obj;}

在大多数情况下,如果类成员在MATLAB中被设置为私有,则它也被设置为生成的C++代码中的私有。

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

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

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

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

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

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

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

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

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

类MyClass{public:MyClass*init(双值);void publicMethod(双值);静态双double doubleThisValue(双值);double CalculateMeValue()常量;double publicProp;private:double privateProp;};

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

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

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

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

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

静态双doubleThisValue(双val);

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

公共方法calculateSomeValue不会更改对象。生成的方法具有以下签名:

双重CalculateMeValue()常量;

附加的使用说明和限制

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

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

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

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

  • 如果一个MATLAB类成员有不同获取访问权限SetAccess属性,则生成的类的相应成员具有两个属性中更大的权限。例如,如果一个属性道具具有这些属性(GetAccess=public,SetAccess=private)道具在生成的代码中定义为公共属性。

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

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

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

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

另请参阅

||

相关话题