При создании кода C++ поведение генератора кода по умолчанию создает классы C++ для классов в коде MATLAB ®. К ним относятся все классы MATLAB, такие как классы значений, классы дескрипторов и системные объекты.
Можно изменить поведение генератора кода по умолчанию для создания структур для классов MATLAB. Чтобы изменить поведение по умолчанию, выполните одно из следующих действий.
В объекте конфигурации кода установите TargetLang кому 'C++' и CppPreserveClasses кому false.
В приложении MATLAB Coder™ на шаге Создать установите для параметра Язык значение C++. В параметрах построения проекта на вкладке «Внешний вид кода» снимите флажок «Создать классы C++ из классов MATLAB».
Эти примеры иллюстрируют определенные правила, которым генератор кода следует при сопоставлении классов MATLAB с классами C++.
Определение класса дескрипторов MATLAB MyClass:
classdef MyClass < handle properties publicProp = 1; end properties(Access = private) privateProp end methods function obj = MyClass(value) obj.privateProp = value; end function publicMethod(obj,value) obj.privateMethod(value); end function res = calculateSomeValue(obj) res = obj.publicProp*obj.privateProp; end end methods (Access = private) function privateMethod(obj,value) obj.publicProp = obj.publicProp + value; obj.privateProp = obj.privateProp + obj.doubleThisValue(value); end end methods(Static) function res = doubleThisValue(val) res = 2 * val; end end end
Определение функции MATLAB foo который использует MyClass:
function out = foo(x,y) obj = MyClass(x); obj.publicMethod(y); out = obj.calculateSomeValue; end
Создание статической библиотеки C++ для foo. Укажите входной аргумент как двойной скаляр. Задать свойство конфигурации создания кода InlineBetweenUserFunctions кому 'Readability'.
cfg = coder.config('lib'); cfg.TargetLang = 'C++'; cfg.InlineBetweenUserFunctions = 'Readability'; codegen -config cfg foo -args {0,0} -report
Code generation successful: View reportОткройте отчет о создании кода и проверьте созданный код. Файл MyClass.h содержит определение созданного класса C++ MyClass:
class MyClass
{
public:
MyClass *init(double value);
void publicMethod(double value);
static double doubleThisValue(double val);
double calculateSomeValue() const;
double publicProp;
private:
double privateProp;
};Это код, созданный для функции. foo:
double foo(double x, double y)
{
MyClass obj;
obj.init(x);
obj.publicMethod(y);
return obj.calculateSomeValue();
}В этой таблице перечислены некоторые правила, которым следует генератор кода при создании классов C++, и соответствующие фрагменты из кода, созданного для MyClass.
| Правило | Фрагмент кода |
|---|---|
Конструктор класса в MATLAB сопоставлен с | Файл MyClass *MyClass::init(double value)
{
MyClass *obj;
obj = this;
obj->publicProp = 1.0;
obj->privateProp = value;
return obj;
} |
В большинстве случаев, если член класса установлен в MATLAB как частный, он также устанавливается как частный в сгенерированном коде C++. В некоторых ситуациях при встраивании общедоступного метода в сгенерированный код C++ частное свойство в коде MATLAB изменяется на общедоступное свойство в сгенерированном коде и разрывается инкапсуляция данных. Например, предположим, что общедоступный метод Чтобы ограничить это вхождение, генератор кода использует специальное правило inlinig для открытых методов в этой ситуации:
В этих ситуациях одни и те же внутренние правила применяются как к обычным функциям, так и к публичным методам:
См. раздел Управление встроением для точной настройки производительности и читаемости сгенерированного кода. | Определение созданного класса C++ class MyClass
{
public:
MyClass *init(double value);
void publicMethod(double value);
static double doubleThisValue(double val);
double calculateSomeValue() const;
double publicProp;
private:
double privateProp;
};Видимость всех данных и функций-членов сохраняется между MATLAB и сгенерированным кодом. Частный метод void MyClass::publicMethod(double value)
{
this->publicProp += value;
this->privateProp += MyClass::doubleThisValue((value));
} |
Статические методы в MATLAB отображаются на статические методы C++. | Созданный код для статического метода static double doubleThisValue(double val); |
Методы, которые не изменяют объект, помечены как | Общедоступный метод double calculateSomeValue() const; |
Это некоторые дополнительные примечания по использованию и ограничения для генерации классов C++ из классов MATLAB:
Прототип класса для MyClass содержится в файле заголовка MyClass.h. Реализации методов класса содержатся в файле MyClass.cpp.
В созданном коде иерархии классов распрямляются. Например, предположим, что в коде MATLAB класс B наследует от класса A. В сгенерированном коде C++ классы B и A не имеют между ними отношений наследования. В созданном коде все свойства и методы класса A воспроизводятся в определении класса B.
Когда класс MATLAB использует различные типы для своих свойств, генератор кода создает отдельный класс C++ для каждого типа использования.
Если элемент класса MATLAB отличается GetAccess и SetAccess , соответствующий член созданного класса имеет более разрешительный из двух атрибутов. Например, если свойство prop имеет атрибуты (GetAccess = public, SetAccess = private), prop определяется как общедоступное свойство в созданном коде.
При попытке создать автономный код, содержащий классы C++ для классов MATLAB, может появиться предупреждающее сообщение, если выполняются оба условия:
Вы можете создать код для повторного ввода, включив MultiInstanceCode параметр в объекте конфигурации кода или путем включения параметра Генерировать код повторного входа в приложении MATLAB Coder.
Деструктор класса в коде MATLAB имеет постоянную переменную или вызывает другую функцию, которая объявляет и использует постоянную переменную.
В таких ситуациях для генерации кода, содержащего классы C++ для классов MATLAB, отключите MultiInstanceCode или параметр Создать код повторного входа.
coder.CodeConfig | coder.EmbeddedCodeConfig | coder.MexCodeConfig