[Pyrex] C++ forward declaration

Lenard Lindstrom len-l at telus.net
Sat Apr 5 00:21:51 CEST 2008


Robert Bradshaw wrote:
> On Apr 3, 2008, at 4:20 PM, Ravi Lanka wrote:
>   
>> Pyrex gurus,
>>
>>    I am trying to wrap two C++ classes in a Namespace called
>> "MyNameSpace".  I was breezing through using some of the ideas  
>> shared by
>> Lenard and others.  I got stuck with a case of forward declaration as
>> below.  The two classes I have, A and B, have methods that require the
>> objects corresponding to B and A.  If I try to declare, say class B,
>> without all the methods before class A and then try to create the
>> complete code for class B, it complains that class B is re-declared.
>> How do I get around this problem ?
>>
>> cdef extern from "A.h":
>>     ctypedef struct A "MyNameSpace::A":
>>         void (*foo)( B data )
>>
>> cdef extern from "B.h":
>>     ctypedef struct B "MyNameSpace::B":
>>         void (*bar)( A data )
>>
>> thanks
>> Ravi
>>     
>
> I believe you have to do a forward declaration. The following works  
> for me:
>
>
> cdef extern from "B.h":
>      ctypedef struct B
>
> cdef extern from "A.h":
>      ctypedef struct A "MyNameSpace::A":
>          void foo(B data)
>
> cdef extern from "B.h":
>      ctypedef struct B "MyNameSpace::B":
>          void bar(A data)
>
> cdef A a
> cdef B b
>
> # this will compile...but don't run it
> a.foo(b)
> b.bar(a)
>
>
>   
First, the Pyrex 0.9.6.4 compiler rejected the above code given by 
Robert Bradshaw. Second, even when altered to use function pointers the 
generated code was wrong. The global variable b was delcared as "B", not 
"MyNameSpace::B". This example corrects both problems:

cdef extern from "B.h":
     ctypedef struct B "MyNameSpace::B"

cdef extern from "A.h":
     ctypedef struct A "MyNameSpace::A":
         void (* foo)(B data)

cdef extern from "B.h":
     ctypedef struct B "MyNameSpace::B":
         void (* bar)(A data)

cdef A a
cdef B b

# this will compile...but don't run it
a.foo(b)
b.bar(a)

Note that B.h will be included before A.h in the generated C file.

-- 
Lenard Lindstrom
<len-l at telus.net>




More information about the Pyrex mailing list