Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
June 15, 2004 static member functions | ||||
---|---|---|---|---|
| ||||
I am working with some automatically generated D interface code where code for each C++ class being wrapped is put into a different file. The problem is that the classes interact, and that I have a problem with permission to see a specific static member function between classes. It all works if the code is all in one file. Example: public class A { private void* Ptr; private static void* getPtr(A obj) { return (obj === null) ? null : Ptr; } } is an extract from automatically generated code. If a second class B has a constructor with an A as an argument the code generated is public class B { // ... public this(A a) { // contains A.getPtr(a) which fails unless the code for B is in the same file as the code for A. // This applies even if I change the permission of the static function to public. } } One workaround is to put into the defintion of A the extra member function public void* Ptr() { return getPtr(this); } which can be seen from the other file, i.e. putting a.Ptr() for A.getPtr(). I am in a position to edit the code which does the automatic generation, and the aim is to find a general solution which would result in the generation of valid code which works. There should be no need to edit the result. At the moment the question is, is there a way in which the code of class A could be altered so that class B can see A.setPtr(obj) even when they are in separate files? More details of the background to this are on http://www.prowiki.org/wiki4d/wiki.cgi?DwithSwig Thanks John Fletcher |
June 15, 2004 Re: static member functions | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Fletcher |
Declaring getPtr as static and public should work. I recommend getting an example of the problem with as few lines as possible and post it on digitalmars.D.bugs.
John Fletcher wrote:
> I am working with some automatically generated D interface code where code for each C++ class being wrapped is put into a different file. The problem is that the classes interact, and that I have a problem with permission to see a specific static member function between classes. It all works if the code is all in one file.
>
> Example:
>
> public class A {
> private void* Ptr;
> private static void* getPtr(A obj) {
> return (obj === null) ? null : Ptr; }
> }
>
> is an extract from automatically generated code.
>
> If a second class B has a constructor with an A as an argument the code generated is
>
> public class B {
> // ...
> public this(A a) {
> // contains A.getPtr(a) which fails unless the code for B is in
> the same file as the code for A.
> // This applies even if I change the permission of the static
> function to public.
> }
> }
>
> One workaround is to put into the defintion of A the extra member function
>
> public void* Ptr() { return getPtr(this); }
>
> which can be seen from the other file, i.e. putting a.Ptr() for
> A.getPtr().
>
> I am in a position to edit the code which does the automatic generation, and the aim is to find a general solution which would result in the generation of valid code which works. There should be no need to edit the result.
>
> At the moment the question is, is there a way in which the code of class A could be altered so that class B can see A.setPtr(obj) even when they are in separate files?
>
> More details of the background to this are on
>
> http://www.prowiki.org/wiki4d/wiki.cgi?DwithSwig
>
> Thanks
>
> John Fletcher
|
June 16, 2004 Re: static member functions | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ben Hinkle | In article <camq9o$1sb1$1@digitaldaemon.com>, Ben Hinkle says... > > >Declaring getPtr as static and public should work. I recommend getting an example of the problem with as few lines as possible and post it on digitalmars.D.bugs. > Thanks for the hint. It isn't a bug, but a misunderstanding of mine. The problem is that the automatically generated file has the same name as the class within it. When class A has a public static member e.g. class A { public static void* getPtr(A obj) { // something } } The structure in a class B importing a class A is that A is the module and the class is referred to as A.A import A; class B { public void* getAPtr(A obj) { return A.A.getPtr(a); // This works. } //public void* getAPtr(A obj) { // return A.getPtr(a); This fails. //} } I now need to alter the SWIG code generator for D to do the correct thing. Thanks again. John |
June 18, 2004 Re: static member functions | ||||
---|---|---|---|---|
| ||||
Posted in reply to john |
john@bunbury28.plus.com wrote:
> In article <camq9o$1sb1$1@digitaldaemon.com>, Ben Hinkle says...
> >
> >
> >Declaring getPtr as static and public should work. I recommend getting an example of the problem with as few lines as possible and post it on digitalmars.D.bugs.
> >
>
> Thanks for the hint. It isn't a bug, but a misunderstanding of mine. The problem is that the automatically generated file has the same name as the class within it.
>
> I now need to alter the SWIG code generator for D to do the correct thing.
>
> Thanks again.
>
> John
The alternative is to rename the file e.g. classA.d instead of A.d
This is what I have done.
John
|
June 18, 2004 Re: static member functions | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Fletcher | John Fletcher wrote:
> I am working with some automatically generated D interface code where code for each C++ class being wrapped is put into a different file. The problem is that the classes interact, and that I have a problem with permission to see a specific static member function between classes. It all works if the code is all in one file.
>
> Example:
>
> public class A {
> private void* Ptr;
> private static void* getPtr(A obj) {
> return (obj === null) ? null : Ptr; }
> }
It might just be a typo in the post, but still: accessing "Ptr" within a static function will not work. Instead, it should be "obj.Ptr".
|
Copyright © 1999-2021 by the D Language Foundation