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

Когда вы генерируете библиотеки C++ или исполняемые файлы, поведение по умолчанию генератора кода должно произвести классы C++ для классов в вашем коде MATLAB®. Они включают все классы MATLAB, такие как классы значения, классы Handle и системные объекты.

Если вы генерируете код C++ MEX, генератор кода производит структуры для классов в вашем коде MATLAB. Для библиотек C++ и исполняемых файлов, можно изменить поведение по умолчанию генератора кода и произвести структуры для классов MATLAB. Чтобы сделать этот выбор, выполнить одно из следующих действий:

  • В настройке возражают для автономной генерации кода (coder.CodeConfig или coder.EmbeddedCodeConfig), установите 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. Задайте входной параметр, чтобы быть двойным скаляром.

codegen -config:lib -lang:c++ foo -args {0,0} -report
Code generation successful: View report

Откройте отчет генерации кода и смотрите сгенерированный код. Файл foo_types.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 из объекта вызван функцией точки входа в MATLAB. Кроме того, примите тот myMethod содержит coder.inline('always') директива, которая обеспечивает myMethod быть встроенным в сгенерированном коде. Так, в сгенерированном коде, свойстве prop должен отобразиться снаружи объекта и изменен на общественность.

Чтобы ограничить вхождение этого явления, генератор кода не встраивает открытый метод, если метод не содержит coder.inline('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:

  • Если именем вашего проекта MATLAB Coder является foo.prj, прототипы класса содержатся в файле foo_types.h. Реализации методов класса MyClass содержатся в файле 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.

Смотрите также

|

Похожие темы