Mandeep Singh Brar napisał:

> I have a class A in module testD as follows
> 
> module testD;
> import std.stdio;
> public class A {
>       public this() {
>               writeln("const");
>       }
>       public void a(string l, int k) {
>               writeln("Hello B.a", l, k);
>       }
> }
> 
> I have another file which uses this class as follows:
> 
> module user;
> import std.stdio;
> 
> int main() {
>       Object obj = Object.factory("testD.A");
>       if(obj is null)
>               writeln("null object");
>       else
>               writeln("object created");
>       return 0;
> }
> 
> When i compile the class A as "dmd -c -of testD testD.d" and the second file 
> as "dmd user.d testD",
> the example works fine and the object gets created.
> 
> But When i compile the class A as "dmd -c -lib testD.d" and the second file 
> as "dmd user.d testD.a",
> the example gives me a null object.
> 
> The Object.factory method does not seem to work if my class has been compiled 
> as a static library.
> Can you please let me know how to solve this. I have tried replacing public 
> with export for class
> testD, but that does not help.

 I think dmd creates type information for each compilation, but doesn't merge 
it when linking. I hope it's a bug and will also be fixed for dynamic libs.

A (not nice) workaround may be exposing in your lib:

Object objectFactory(string name) {
        return Object.factory(name);
}

and calling it in your program. This should look for the type name in your 
lib's info.

BTW, am I the only one to think Object.factory is a bad name? It doesn't return 
a factory. Sure, one can get used to it, but why not Object.make or .create or 
.instance?

-- 
Tomek

Reply via email to