C++ class

BlitzMax Forums/BlitzMax Programming/C++ class

Hi,

Am I right in thinking that in order for BlitzMax to use a C++ class I would have to write a .c wrapper to create an instance of the class and to access the member funcitons and then, finally a .bmx wrapper?

Any help, *pointers most appreciated.

It would probably be better to use a .cpp wrapper.

You can have the wrapper return a pointer to the C++ object, which you can later use to pass back and do stuff with.

Remember, if you create a C++ object with "new", you may also need to "delete" it later.

:o)

Ok, thanks for the advice.

Perhaps something along the lines of this completely untested code :

test.cpp
class MyClass
{
public:
   MyClass();
   void DoSomething();
}

MyClass::MyClass()
{}

void MyClass::DoSomething()
{
}

extern "C" {

  MyClass * create_new_myclass();
  void myclass_dosomething(MyClass * myclass);

}

MyClass * create_new_myclass() {
    return new MyClass();
}

void myclass_dosomething(MyClass * myclass) {
    myclass->DoSomething();
}


testwrap.bmx
Superstrict

Import "test.cpp"

Extern
  Function create_new_myclass:Byte Ptr()
  Function myclass_dosomething(myclass:Byte Ptr)
End Extern

Local b:Byte Ptr = create_new_myclass()

myclass_dosomething(b)


Thanks again!

Guess I'll buy BlitzMax then.

ohh....thx brucey :-) always wondered myself, just didnt want to ask ;-)

p.s hows you ffmpeg mod coming?

unless i'm very much mistaken, and i'm not, you can't wrap C++ functions directly.

Well I guess you might if you knew what internal post decorated name the functions had. but the above untested example won't work.

Believe me, I've tried.

but the above untested example won't work.


Oh... bugger... well... it seemed a good idea at the time.



FYI :-)

Some "real" code snippets, from my DateTime module (wrapping the C++ Boost libs):

.. creating a new instance of a C++ class ..
time_duration * bmx_time_duration(int hours, int minutes, int seconds, int fraction) {
	return new time_duration(hours, minutes, seconds, fraction);
}

... using that instance ...
int bmx_time_duration_hours(time_duration * d) {
	return d->hours();
}


Which part of that won't work?

Sorry... the .bmx bits too... just for clarity :-)

..in the extern..
	Function bmx_time_duration_hours:Int(duration:Byte Ptr)

..in the main code..
	Method hours:Int()
		Return bmx_time_duration_hours(durationPtr)
	End Method


Guess I'll buy BlitzMax then.

Geepers... where's my commission? :-p