Сгенерируйте классы C++ для классов MATLAB

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

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

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

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

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

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

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

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

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

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

  • Вы устанавливаете свойство строения кода InlineBetweenUserFunctions или эквивалентная настройка генерации кода, Inline between user functions в приложении 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 классов. В сгенерированном коде код С++ 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.

См. также

| |

Похожие темы