November 19, 2004 How to make a singleton? | ||||
---|---|---|---|---|
| ||||
I tried to make a singleton for some particular class. As in C++ I made constructor of this class protected, made method for instance access and so on. All works fine until I try to instanciate my class outside the module where it is defined. I was surprised but I didn't get any compile error after this trick. How to prevent construction of class outside any module other then class owner? Kernel kernel; static this() { kernel = new Kernel; } class Kernel { protected: this() { hInstance = GetModuleHandleA(null); } public: ..... } // another module snipet int main ( char [] [] args ) { Kernel k = new Kernel; // no error! kernel.runMainLoop(); return 0; } Is it normaly? ---- nail |
November 20, 2004 Re: How to make a singleton? | ||||
---|---|---|---|---|
| ||||
Posted in reply to nail | nail wrote: > I tried to make a singleton for some particular class. As in C++ I made > constructor of this class protected, made method for instance access and so on. > All works fine until I try to instanciate my class outside the module where it > is defined. I was surprised but I didn't get any compile error after this trick. > How to prevent construction of class outside any module other then class owner? I think you're pretty close to your goal. Most importantly, you probably should upgrade to DMD 0.106. A recent bugfix allows privatizing this(). The following code works for me (i.e., it doesn't)... /* *** kernel.d *** */ import std.c.windows.windows; Kernel myKernel; static this() { myKernel = new Kernel; } class Kernel { protected: this() { void* hInstance = GetModuleHandleA(null); } public: void runMainLoop() {} } /* *** main.d *** */ import kernel; int main ( char [] [] args ) { Kernel k = new Kernel; /* it won't work in DMD 0.106 */ myKernel.runMainLoop(); return 0; } @rem /* *** build.bat *** */ @echo off dmd dmd main.d kernel.d main.exe pause erase *.obj erase *.map -- Justin (a/k/a jcc7) http://jcc_7.tripod.com/d/ |
Copyright © 1999-2021 by the D Language Foundation