Weird (?) problem

James Dunne james.jdunne at gmail.com
Thu Aug 10 05:47:26 PDT 2006


mike wrote:
> [snip]
> 
> 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
> 

Create two constructors for your TypeType classes.

One private c'tor with a dummy parameter to differentiate it from the 
normal public c'tor.

Call that private c'tor in your static c'tor; the private c'tor should 
obviously _not_ call into your registration system.

The normal public c'tor should call the registration system, just like 
in your code above.

class TypeType : TypeBase {
     TypeBase instance = null;

     static this() {
         instance = new TypeType(true);
         addObject("typetype");
         addObject("typetype").setType(instance);
     }
     static TypeBase opCall() { return instance; }

     public this() {
         addObject("typetype");
         getObject("typetype").setType(TypeType());
     }

     private this(bool dummy) {
         // Just a dummy to suppress infinite recursion in constructor
         // calls...
     }
}

I'm curious as to the purpose of the multiple registration of the 
"typetype" named instance in your registry system.  I hope you get the 
basic idea of what I'm proposing so you can fix these issues yourself. :)

-- 
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS/MU/S d-pu s:+ a-->? C++++$ UL+++ P--- L+++ !E W-- N++ o? K? w--- O 
M--@ V? PS PE Y+ PGP- t+ 5 X+ !R tv-->!tv b- DI++(+) D++ G e++>e 
h>--->++ r+++ y+++
------END GEEK CODE BLOCK------

James Dunne



More information about the Digitalmars-d-learn mailing list