Classes and inheritance now working as demonstrated by the classic SWIG class example

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@4527 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
William S Fulton 2003-03-12 20:45:47 +00:00
parent a7bc7a6ba9
commit f0826f2391
6 changed files with 175 additions and 0 deletions

View File

@ -0,0 +1,14 @@
runme
*_wrap.c
*_wrap.cxx
*.iltmp
*.cs
*.dll
*.dsw
*.exp
*.lib
*.ncb
*.opt
*.plg
Release
Debug

View File

@ -0,0 +1,18 @@
TOP = ../..
SWIG = $(TOP)/../swig
CXXSRCS = example.cxx
TARGET = example
INTERFACE = example.i
SWIGOPT =
all:: csharp
csharp::
$(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' csharp_cpp
cscc *.cs -o runme
clean::
$(MAKE) -f $(TOP)/Makefile csharp_clean
check: all

View File

@ -0,0 +1,28 @@
/* File : example.c */
#include "example.h"
#define M_PI 3.14159265358979323846
/* Move the shape to a new location */
void Shape::move(double dx, double dy) {
x += dx;
y += dy;
}
int Shape::nshapes = 0;
double Circle::area(void) {
return M_PI*radius*radius;
}
double Circle::perimeter(void) {
return 2*M_PI*radius;
}
double Square::area(void) {
return width*width;
}
double Square::perimeter(void) {
return 4*width;
}

View File

@ -0,0 +1,39 @@
/* File : example.h */
class Shape {
public:
Shape() {
nshapes++;
}
virtual ~Shape() {
nshapes--;
};
double x, y;
void move(double dx, double dy);
virtual double area(void) = 0;
virtual double perimeter(void) = 0;
static int nshapes;
};
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) { };
virtual double area(void);
virtual double perimeter(void);
};
class Square : public Shape {
private:
double width;
public:
Square(double w) : width(w) { };
virtual double area(void);
virtual double perimeter(void);
};

View File

@ -0,0 +1,10 @@
/* File : example.i */
%module example
%{
#include "example.h"
%}
/* Let's just grab the original header file here */
%include "example.h"

View File

@ -0,0 +1,66 @@
// This example illustrates how C++ classes can be used from C# using SWIG.
// The C# class gets mapped onto the C++ class and behaves as if it is a C# class.
using System;
public class runme
{
static void Main()
{
// ----- Object creation -----
Console.WriteLine( "Creating some objects:" );
using (Square s = new Square(10))
using (Circle c = new Circle(10))
{
Console.WriteLine( " Created circle " + c );
Console.WriteLine( " Created square " + s );
// ----- Access a static member -----
Console.WriteLine( "\nA total of " + Shape.nshapes + " shapes were created" );
// ----- 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;
Console.WriteLine( "\nHere is their current position:" );
Console.WriteLine( " Circle = (" + c.x + " " + c.y + ")" );
Console.WriteLine( " Square = (" + s.x + " " + s.y + ")" );
// ----- Call some methods -----
Console.WriteLine( "\nHere are some properties of the shapes:" );
Shape[] shapes = {c,s};
// for (int i=0; i<shapes.Size; i++)
for (int i=0; i<2; i++)
{
Console.WriteLine( " " + shapes[i].ToString() );
Console.WriteLine( " area = " + shapes[i].area() );
Console.WriteLine( " perimeter = " + shapes[i].perimeter() );
}
// Notice how the area() and perimeter() functions really
// invoke the appropriate virtual method on each object.
// ----- Delete everything -----
Console.WriteLine( "\nGuess I'll clean up now" );
}
// Note: when this using scope is exited the C# Dispose() methods
// are called which in turn call the C++ destructors
Console.WriteLine( Shape.nshapes + " shapes remain" );
Console.WriteLine( "Goodbye" );
}
}