XS C++ return class pointers

[email protected] (James Shirley)
Newsgroups perl.xs
Message-ID <[email protected]>
Hi, I'm trying to write a XS routine to return a point to a c++ class to be
accessible from perl..

I'm new to XS, so i've been following:

http://www.johnkeiser.com/perl-xs-c++.html

and

http://search.cpan.org/~dmr/CookBookB-19960430/

However when I try make the xs generated code, i get the following compiler
error:

g++ -c  -I. -D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe
-fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE
-D_FILE_OFFSET_BITS=64 -O2 -g   -DVERSION=\"0.01\" -DXS_VERSION=\"0.01\"
-fPIC "-I/usr/lib/perl/5.10/CORE"   MyPackage.c
MyPackage.c: In function ‘void XS_MyPackage_child(PerlInterpreter*, CV*)’:
MyPackage.c:168: error: ‘CLASS’ was not declared in this scope
make: *** [MyPackage.o] Error 1

I assume I'm doing something wrong in the child method, however i lifted
this code out of one of the CookBookB examples..

MyClass *
MyClass::child()
  CODE:
    RETVAL = (MyClass *)safemalloc( sizeof(MyClass) );
    *RETVAL = THIS->child();

  OUTPUT:
    RETVAL

  CLEANUP:
    safefree(RETVAL);

Any help would be much appreciated.

I have the following code:

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"

#ifdef __cplusplus
  extern "C" {
#endif
    #include "EXTERN.h"
    #include "perl.h"
    #include "XSUB.h"
#ifdef __cplusplus
  }
#endif

#undef list

#include <iostream>

class MyClass;

class MyClass {
  private:
    int _id;

  public:
    MyClass(int id) {
      _id = id;
    }

    ~MyClass() { }

    void operator =(const MyClass &other) {
      _id = other._id;
    }

    int id() {
      return _id;
    }

    MyClass child() {
      return MyClass(5);
    }
};

MODULE = MyPackage    PACKAGE = MyPackage

MyClass *
MyClass::new(int id)

void
MyClass::DESTROY()

MyClass *
MyClass::child()
  CODE:
    RETVAL = (MyClass *)safemalloc( sizeof(MyClass) );
    *RETVAL = THIS->child();

  OUTPUT:
    RETVAL

  CLEANUP:
    safefree(RETVAL);

With the Makefile.PL:

use 5.010001;
use ExtUtils::MakeMaker;

$CC = 'g++';
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.
WriteMakefile(
    NAME              => 'MyPackage',
    VERSION_FROM      => 'lib/MyPackage.pm', # finds $VERSION
    PREREQ_PM         => {}, # e.g., Module::Name => 1.1
    ($] >= 5.005 ?     ## Add these new keywords supported since 5.005
      (ABSTRACT_FROM  => 'lib/MyPackage.pm', # retrieve abstract from module
       AUTHOR         => 'James <james@>') : ()),
    LIBS              => [''], # e.g., '-lm'
    DEFINE            => '', # e.g., '-DHAVE_SOMETHING'
    INC               => '-I.', # e.g., '-I. -I/usr/include/other'
    CC                => $CC,
    LD                => '$(CC)',
    XSOPT             => '-C++',
    TYPEMAPS          => ['perlobject.map' ],
  # Un-comment this if you add C files to link with later:
    # OBJECT            => '$(O_FILES)', # link all the C files too
);

and the typemap:

TYPEMAP
MyClass *         O_OBJECT


Cheers James
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.