How to disable/hide constructor when using factory method?

JN 666total at wp.pl
Thu Jan 24 12:48:43 UTC 2019


On Wednesday, 23 January 2019 at 19:41:44 UTC, Alex wrote:
> On Wednesday, 23 January 2019 at 19:26:37 UTC, JN wrote:
>> class Foo
>> {
>>     static Foo makeFoo()
>>     {
>>         Foo f = new Foo();
>>         return f;
>>     }
>> }
>>
>> void main() {
>>     Foo f = Foo.makeFoo();
>> }
>>
>> For a code like this. I'd like all users of the class to be 
>> forced to create instances using the static method makeFoo. I 
>> want to disallow "new Foo()". But I don't know if it's 
>> possible to disable the constructor, while still making it 
>> available in the makeFoo static method.
>>
>> @disable this doesn't work, private this(); doesn't work 
>> either.
>
> private should work, if the class and the main are in different 
> modules, no?

I expected that too, but it doesn't even work in the same module.

class Foo
{
     private this();

     static Foo makeFoo()
     {
         Foo f = new Foo();
         return f;
     }
}

void main() {
}

fails with:

onlineapp.o:onlineapp.d:_D9onlineapp3Foo7__ClassZ: error: 
undefined reference to '_D9onlineapp3Foo6__ctorMFZCQzQr'
onlineapp.d:7: error: undefined reference to 
'_D9onlineapp3Foo6__ctorMFZCQzQr'
collect2: error: ld returned 1 exit status
Error: linker exited with status 1

I don't understand why is this a linker problem. My understanding 
is that for some reason static methods don't have access to the 
private constructor (they're not considered same module?). But 
even though, it should error with something like "Foo.makeFoo() 
cannot access private Foo.this()" rather than fail at linking.


More information about the Digitalmars-d-learn mailing list