/* 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.