Когда вы генерируете код С++, поведение генератора кода по умолчанию создает классы C++ для классов в MATLAB® код. Они включают все классы MATLAB, такие как классы значений, классы handle и системные объекты.
Можно изменить поведение генератора кода по умолчанию, чтобы создать структуры для классов MATLAB. Чтобы изменить поведение по умолчанию, выполните одно из следующих действий:
В объекте строения кода задайте TargetLang
на 'C++'
и CppPreserveClasses
на false
.
В приложении MATLAB Coder™ на Generate шаге установите Language равным C++. В настройках сборки проекта на вкладке Code Appearance снимите флажок Generate C++ classes from MATLAB classes.
Эти примеры иллюстрируют определенные правила, которым следует генератор кода при сопоставлении классов MATLAB с классами C++.
Задайте класс Handle 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 как частный, он также устанавливается как частный в сгенерированном коде С++. В некоторых ситуациях включение общедоступного метода в сгенерированный Код С++ изменяет частную собственность в коде 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
классов. В сгенерированном коде код С++
B
и A
не имеют между ними наследственных отношений. В сгенерированном коде все свойства и методы A классов
воспроизводятся в определении класса B
.
Когда класс MATLAB использует различные типы для своих свойств, генератор кода производит отдельный класс C++ для каждого использования типа.
Если член класса MATLAB имеет другие GetAccess
и SetAccess
атрибуты, соответствующий представитель сгенерированного класса имеет более допустимый из этих двух атрибутов. Для примера, если свойство prop
имеет атрибуты (GetAccess = public, SetAccess = private)
, prop
определяется как общественная собственность в сгенерированном коде.
При попытке сгенерировать автономный код, содержащий классы C++ для классов MATLAB, вы можете получить предупреждение, если оба из этих условий верны:
Вы принимаете решение сгенерировать повторный код путем включения MultiInstanceCode
параметр в объекте строения кода или путем включения параметра Generate re-entrant code в приложении MATLAB Coder.
Деструктор класса в коде MATLAB имеет постоянную переменную или вызывает другую функцию, которая объявляет и использует постоянную переменную.
В таких ситуациях, чтобы сгенерировать код, который содержит классы C++ для классов MATLAB, отключите MultiInstanceCode
или параметр Generate re-entrant code.
coder.CodeConfig
| coder.EmbeddedCodeConfig
| coder.MexCodeConfig