// This example illustrates how C++ classes can be used from D using SWIG. // The D class gets mapped onto the C++ class and behaves as if it is a D class. module runme; import std.stdio; import example; void main() { // ----- Object creation ----- writeln( "Creating some objects:" ); { scope Square s = new Square(10); scope Circle c = new Circle(10); // ----- Access a static member ----- writefln( "%s shapes were created.", Shape.nshapes ); // ----- Member data access ----- // Notice how we can do this using functions specific to // the 'Circle' class. c.x = 20; c.y = 30; // Now use the same functions in the base class Shape shape = s; shape.x = -10; shape.y = 5; writeln( "\nHere is their current position:" ); writefln( " Circle = ( %s, %s )", c.x, c.y ); writefln( " Square = ( %s, %s )", s.x, s.y ); // ----- Call some methods ----- writeln( "\nHere are some properties of the shapes:" ); Shape[] shapes = [ cast(Shape) c, cast(Shape) s ]; foreach ( currentShape; shapes ) { writefln( " %s", currentShape.classinfo.name ); writefln( " area = %s", currentShape.area() ); writefln( " perimeter = %s", currentShape.perimeter() ); } // Notice how the area() and perimeter() functions really // invoke the appropriate virtual method on each object. // ----- Delete everything ----- writeln( "\nGuess I'll clean up now:" ); // Note: when this using scope is exited the D destructors are called which // in turn call the C++ destructors. } writefln( "%s shapes remain", Shape.nshapes ); writeln( "\nGoodbye!" ); }