Weird (?) problem

Ary Manzana asterite at gmail.com
Thu Aug 10 05:14:07 PDT 2006


mike wrote:
> Hi!
> 
> I've run into a big problem in my project, it's not really a problem 
> with D, more a problem with ... you'll see.
> 
> Anyway: I've got a couple of classes in my project which represent type 
> information (like MIDI notes, audio output, sample data, etc. - it'll be 
> an audio app written in D). Basically it's a reflection system with some 
> extras that are specific to this project.
> 
> Now, the idea is that every of these type classes has a static field 
> which holds a single instance, like that:
> 
> ' class TypeFoo : TypeBase
> ' {
> '     static TypeBase instance = null;
> '     static this() { instance = new TypeFoo(); }
> ' }
> 
> I've got a static opCall to return that instance:
> 
> ' static TypeBase opCall() { return instance; }
> 
> Now everywhere I need to call an overloaded constructor or tell some 
> object which type of other objects it can process, I just can call
> 
> ' TypeFoo()
> 
> and get my type class.
> 
> Next is, I've got a namespace- or registry-like tree system, where all 
> objects are stored into. That's where I store the information of "I can 
> process objects of type X" too. It's somehow like:
> 
> ' getObject("foo").setType(TypeFoo());
> ' getObject("foo").addCanProcess(TypeBar());
> 
> Now the thing is that the type classes need to identify themselves to 
> the rest of the system as type classes. Therefore I've got a TypeType 
> class. Which also resides in that tree.
> 
> Up until now I set up this information on my type classes via a 
> "construct"-function, which was called at a point where the class 
> instances already exist. But I'm a bit fed up of having to maintain two 
> pieces of code (class definition and the construct-function), so I 
> decided to make the type classes able to set up themselves. And here the 
> trouble starts.
> 
> So: In the TypeType static c'tor, I make a new instance of that class. 
> Then the normal c'tor is called, trying to setup itself in the tree 
> system, telling everybody that it is indead a type. So ... it needs the 
> very instance of the TypeType class that is being constructed at that 
> very moment ... so: access violation.
> 
> ' class TypeType : TypeBase
> ' {
> '     TypeBase instance = null;
> '    static this() { instance = new TypeType(); }
> '     static TypeBase opCall() { return instance; }
> '     this()
> '     {
> '          addObject("typetype");
> '          getObject("typetype").setType(TypeType()); // crashes: access 
> violation
> '     }
> ' }
> 
> It's a bit of a chicken and egg problem. I can't new an instance of that 
> class unless there's already one instance there. Is it possible to solve 
> that somehow? Something like an "after_this()" or the like? I guess I've 
> outsmarted myself there and I have no idea what to do about it besides 
> reverting to the old system with that stupid, ugly construct function 
> (shudder).
> 
> Any ideas would be really appreciated.
> 
> -Mike
> 
> --Erstellt mit Operas revolutionärem E-Mail-Modul: 
> http://www.opera.com/mail/

Have you tried placing code after "instance = new TypeType()"?

Like this:

' class TypeType : TypeBase
' {
'     TypeBase instance = null;
'     static this() {
'         instance = new TypeType();
'         // I don't know whether addObject is a function
'         // or a member of TypeType, but you get the point
'         instance.addObject("typetype");
'         instance.getObject("typetype").setType(instance);
'     }
'     static TypeBase opCall() { return instance; }
'     this()
'     {
'     }
' }

Hope that helps (and works).
Ary



More information about the Digitalmars-d-learn mailing list