/* The following example illustrates how to use C++ code with your
C language MEX-file for MATLAB v4.x. It makes use of member
functions, constructors, destructors, and the iostream.
The file is called example.cxx. The routine simply defines
a class, constructs a simple object, and displays the initial
values of the internal variables. It then sets the data members
of the object based on the input given to the MEX-file and displays
the changed values.
The calling syntax is: example( num1, num2 )
The mexFunction definition, math.h, and mex.h are wrapped with
extern "C" so that it has "C linkage" for the benefit of MATLAB.
Within the body of the mexFunction definition, full C++ syntax is
allowed.
At runtime you have to tell the executable (in this case the output
of cmex) where to find the libraries that resolve the C++ symbols.
It needs to know this in order to go look for them at load time.
Compile your MEX-file like this:
g++ -c -I<directory containing mex.h> example.cxx
cmex example.o -L/hub/lib/sun4 -lg++ -lgcc
Jeffery Faneuff April 1, 1994 <jeff@mathworks.com>
Copyright (c) 1994 The Mathworks, Inc.
*/
#include <iostream.h>
extern "C" {
#include <math.h>
#include "mex.h"
}
/****************************/
class MyData {
public:
void display();
void set_data(double v1, double v2);
MyData(double v1 = 0, double v2 = 0);
~MyData() { }
private:
double val1, val2;
};
MyData::MyData(double v1, double v2) { val1 = v1; val2 = v2; }
void MyData::display() {
cout << "Value1 = " << val1 << "\n";
cout << "Value2 = " << val2 << "\n\n";
}
void MyData::set_data(double v1, double v2) { val1 = v1; val2 = v2; }
/*********************/
static
void example( double num1, double num2 )
{
cout << "\nThe initialized data in object:\n";
MyData *d = new MyData; // Create a MyData object
d->display(); // It should be initialized to zeros
d->set_data(num1,num2); // Set data members to incoming values
cout << "After setting the object's data to your input:\n";
d->display(); // Make sure the set_data() worked
delete(d);
return;
}
extern "C" {
void mexFunction(
int nlhs,
Matrix *plhs[],
int nrhs,
Matrix *prhs[]
)
{
double *vin1, *vin2;
/* Check for proper number of arguments */
if (nrhs != 2) {
mexErrMsgTxt("EXAMPLE requires two input arguments.");
} else if (nlhs >= 1) {
mexErrMsgTxt("EXAMPLE requires no output argument.");
}
vin1 = mxGetPr(prhs[0]);
vin2 = mxGetPr(prhs[1]);
example(*vin1, *vin2);
return;
}
} /* end of extern "C" */
(c) Copyright 1994 by The MathWorks, Inc.