Классы-оболочки C++ переопределяют операции преобразования типов, присваивания, индексирования, и некоторые другие, чтобы сделать работу с матрицами, списками, ячейками и потоками привычной и естественной для программиста.

Наиболее быстрый способ реализации метода — вывести его путем наследования из класса-полуфабриката CmaStdMethodDef, описанного в заголовочном файле maComBase.h. Следующий код показывает реализацию метода вычисления для алгоритма наименьших квадратов.


#include 

#include "maComClasses.h"
#include "maComBase.h"


// Метод вычисления в алгоритме наименьших квадратов
class CLsmCalc : public CmaStdMethodDef {
public:
	CLsmCalc () {};
	virtual ~CLsmCalc(){
	};

	MA_INTERFUNC GetDescription (maString* descr);
	MA_INTERFUNC Init (ImaList*param,
                        ImaReadList*input, ImaReadList*output);
	MA_INTERFUNC CalcDef ();
	MA_INTERFUNC CalcCellDef (int argno,
                        maIndex index, ImaCell* cell);
private:
	// ячейки матриц-аргументов
	CmaCell m_Sc_F, m_Sc_y, m_Coeff;
};

// Функция возвращает спецификацию метода
HRESULT CLsmCalc::GetDescription (maString* descr) {
	*descr = L"Calc Sc|F -> Sc|{y}";
	return NOERROR;
}

// Функция инициализации метода
HRESULT CLsmCalc::Init (ImaList*param, ImaReadList*input, ImaReadList*output) {
	CmaList Param = param;
	CmaReadList Input = input;
	CmaReadList Output = output;
	// ячейки матриц-аргументов запоминаются во время инициализации метода,
	// что повышает эффективность доступа к матрицам во время выполнения
	m_Sc_F = Input[L"Sc|F"];
	m_Sc_y = Output[L"Sc|{y}"];
	m_Coeff = Param[L"coeff"];
	return NOERROR;
}

// Вычисление выходной матрицы целиком
HRESULT CLsmCalc::CalcDef () {
	// получение параметров и аргументов
	CmaMatrix A = m_Sc_F;
	CmaMatrix y = m_Sc_y;
	CmaMatrix coeff = m_Coeff;
	// собственно вычисление
	int nSc = A.Size(0);  // число строк матрицы A=Sc|F
	int nF = A.Size(1);   // число столбцов матрицы A=Sc|F
	for (int i=0; i<nSc; i++) {
		double sum = 0.0;
		// вычисление линейной комбинации
		for (int j=0; j<nF; j++)
			sum += A[i][j] * coeff[j];
		y[i] = sum;
	}
	return NOERROR;
}

// Вычисление одной ячейки выходной матрицы
HRESULT CLsmCalc::CalcCellDef (int argno, maIndex index, ImaCell* cell) {
	// получение параметров и аргументов
	CmaMatrix A = m_Sc_F;
	CmaMatrix y = m_Sc_y;
	CmaMatrix coeff = m_Coeff;
	// собственно вычисление
	int i = index->idx[0];
	int nF = A.Size(1);
	double sum = 0.0;
	for (int j=0; j<nF; j++)
		sum += A[i][j] * coeff[j];
	// запись результата в ячейку
	if (cell)
		cell->SetAsDouble (sum);
	else
		y[i] = sum;
	return NOERROR;
}