Static constructors in circularly imported modules - again

Max Samukha spambox at d-coding.com
Thu May 27 06:57:30 PDT 2010


On 05/27/2010 03:47 PM, Jason House wrote:
>
> In module b, delete the import of c. In module c, delete the import of b. Your sample code will then  compile and run.  It probably wouldn't do what you want though; you'll have two globals 
(b.foo and c.foo).  I suspect what you really want is one global a.foo?

Two distinct globals. There is a more concrete example:

module QObject;

class QMetaObject
{
     ...
}

mixin template Q_OBJECT()
{
     ...

     immutable(QMetaObject) metaObject() immutable
     {
         return staticMetaObject;
     }

     static immutable QMetaObject staticMetaObject;
     shared static this()
     {
         staticMetaObject = 
cast(immutable)QMetaObject.create!(typeof(this));
     }
}

----
module a;
import QObject;
import b;

class A : QObject
{
     B b;
     mixin Q_OBJECT;
}

----
module b;
import QObject;
import a;

class B :
{
     A a;
     mixin Q_OBJECT;
}

When mixed in a class, Q_OBJECT, among other things, associates a global 
RTTI object with that class. Ideally, this object should be created at 
program startup.

We cannot impose on the user of Q_OBJECT the requirement that a and b 
should not be circularly imported or that he has to manually call an 
initialization function etc.


More information about the Digitalmars-d mailing list