Когда вы генерируете Код С++, поведение по умолчанию генератора кода производит классы 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