Re: C++ forward declaration

Ravi Lanka <[email protected]>
Newsgroups gmane.comp.python.pyrex
Message-ID <[email protected]>
Lenard Lindstrom wrote:
> 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,

   That's what I ended by doing, but I think I replied only to Robert 
instead of the list.  As always, Thanks for your input.  The mistake I 
made earlier was that I used the code below;

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

instead of

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



Ravi
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.