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