exponenta event banner

Создание классов C++ для классов MATLAB

При создании кода 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 сопоставлен с init способ. При создании экземпляра класса созданный код явно вызывает init способ.

Файл MyClass.cpp содержит определение init.

MyClass *MyClass::init(double value)
{
  MyClass *obj;
  obj = this;
  obj->publicProp = 1.0;
  obj->privateProp = value;
  return obj;
}

В большинстве случаев, если член класса установлен в MATLAB как частный, он также устанавливается как частный в сгенерированном коде C++.

В некоторых ситуациях при встраивании общедоступного метода в сгенерированный код C++ частное свойство в коде MATLAB изменяется на общедоступное свойство в сгенерированном коде и разрывается инкапсуляция данных. Например, предположим, что общедоступный метод myMethod который использует частную собственность prop объекта вызывается функцией точки входа. Если myMethod встроен в созданный код, свойство prop должен быть виден снаружи объекта и изменен на общедоступное свойство.

Чтобы ограничить это вхождение, генератор кода использует специальное правило inlinig для открытых методов в этой ситуации:

  • Если свойство конфигурации кода InlineBetweenUserFunctions или эквивалентная установка генерации кода Inline между пользовательскими функциями в приложении MATLAB Coder имеет значение 'Readability', генератор кода не вводит открытые вызовы метода, которые появляются вне определения класса.

В этих ситуациях одни и те же внутренние правила применяются как к обычным функциям, так и к публичным методам:

  • Тело функции или метода содержит явное coder.inline('always') или coder.inline('never') директива. Эта директива получает наивысший приоритет.

  • Задается свойство конфигурации кода InlineBetweenUserFunctions или эквивалентная установка генерации кода Inline между пользовательскими функциями в приложении MATLAB Coder для 'Never', 'Speed', или 'Always'.

  • Вызов метода появляется внутри другого метода того же класса.

См. раздел Управление встроением для точной настройки производительности и читаемости сгенерированного кода.

Определение созданного класса 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;
};

Видимость всех данных и функций-членов сохраняется между MATLAB и сгенерированным кодом.

Частный метод privateMethod не отображается в этом определении. privateMethod встроен в определение publicMethod (см. в файле MyClass.cpp) :

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

Статические методы в MATLAB отображаются на статические методы C++.

Созданный код для статического метода doubleThisValue имеет следующую подпись:

static double doubleThisValue(double val);

Методы, которые не изменяют объект, помечены как const квалификатор в созданном коде.

Общедоступный метод calculateSomeValue не мутирует объект. Созданный метод имеет следующую подпись:

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 или параметр Создать код повторного входа.

См. также

| |

Связанные темы