digitalmars.D.learn - initialization of structs
- =?ISO-8859-1?Q?Christian_K=F6stlin?= (20/20) Sep 26 2011 Hi,
- Timon Gehr (6/26) Sep 26 2011 Starting with DMD 2.055, this works.
- =?ISO-8859-1?Q?Christian_K=F6stlin?= (33/67) Sep 27 2011 mhh ... strange ... i have dmd 2.055 64bit for linux and this compiles
- Andrej Mitrovic (15/15) Sep 26 2011 You can hide the constructor from external code by using "private
- =?ISO-8859-1?Q?Christian_K=F6stlin?= (4/19) Sep 26 2011 very good ... exactly what I wanted :)
- Andrej Mitrovic (3/4) Sep 26 2011 Sorry for that stupid comment. struct methods don't occupy space in
Hi, I have the problem, that I want to always construct a struct with a parameter. To make this more comfortable (e.g. provide a default parameter I have a factory function to create this struct). struct S { int i; this(int i_) { i = i_; } } S createS(int i=5) { return S(i); } My question now is: Is there a way to enfore the creation of the struct with createS? Or to put it in another way. Is it possible to forbid something like: S s; or even auto s = S(1);? I read about the this(this) thing, but that is only used when the struct is copied, as far as I understood. (My struct has the nature to only work if it is not constructed with the default struct constructor). thank in advance christian
Sep 26 2011
On 09/26/2011 10:55 PM, Christian Köstlin wrote:Hi, I have the problem, that I want to always construct a struct with a parameter. To make this more comfortable (e.g. provide a default parameter I have a factory function to create this struct). struct S { int i; this(int i_) { i = i_; } } S createS(int i=5) { return S(i); } My question now is: Is there a way to enfore the creation of the struct with createS? Or to put it in another way. Is it possible to forbid something like: S s; or even auto s = S(1);? I read about the this(this) thing, but that is only used when the struct is copied, as far as I understood. (My struct has the nature to only work if it is not constructed with the default struct constructor). thank in advance christianStarting with DMD 2.055, this works. struct S{ this() disable; this(int i_) { i = i_; } }
Sep 26 2011
On 09/26/2011 11:15 PM, Timon Gehr wrote:On 09/26/2011 10:55 PM, Christian Köstlin wrote:mhh ... strange ... i have dmd 2.055 64bit for linux and this compiles without error and outputs l: 0 c: 0 import std.stdio : writeln; struct S { private: int[] data; disable this(this); disable this(); this(size_t s) { data = new int[s]; } public: void p() { writeln("l: ", data.length); writeln("c: ", data.capacity); } static S create(size_t s = 8) { return S(s); } } unittest { auto s = S(); s.p(); } int main(string[] args) { return 0; } shouldnt this lead to a compile error? thanks in advance christianHi, I have the problem, that I want to always construct a struct with a parameter. To make this more comfortable (e.g. provide a default parameter I have a factory function to create this struct). struct S { int i; this(int i_) { i = i_; } } S createS(int i=5) { return S(i); } My question now is: Is there a way to enfore the creation of the struct with createS? Or to put it in another way. Is it possible to forbid something like: S s; or even auto s = S(1);? I read about the this(this) thing, but that is only used when the struct is copied, as far as I understood. (My struct has the nature to only work if it is not constructed with the default struct constructor). thank in advance christianStarting with DMD 2.055, this works. struct S{ this() disable; this(int i_) { i = i_; } }
Sep 27 2011
You can hide the constructor from external code by using "private this()". And you can disable the default constructor via disable this(); You may also wish to make your fields private as well. You don't necessarily have to make createS() a free function, you can make it a static function inside of S, ala: struct S { disable this(); static S create(int _i) { return S(_i); } private: int i; this(int i_) { i = i_; } } create() will not occupy any space in any of the S instances. If that doesn't compile it's because I haven't had my coffee yet. :p
Sep 26 2011
On 9/26/11 23:18 , Andrej Mitrovic wrote:You can hide the constructor from external code by using "private this()". And you can disable the default constructor via disable this(); You may also wish to make your fields private as well. You don't necessarily have to make createS() a free function, you can make it a static function inside of S, ala: struct S { disable this(); static S create(int _i) { return S(_i); } private: int i; this(int i_) { i = i_; } } create() will not occupy any space in any of the S instances. If that doesn't compile it's because I haven't had my coffee yet. :pvery good ... exactly what I wanted :) thanks a lot! christian
Sep 26 2011
On 9/26/11, Andrej Mitrovic <andrej.mitrovich gmail.com> wrote:create() will not occupy any space in any of the S instances.Sorry for that stupid comment. struct methods don't occupy space in struct instances regardless if they're static or not.
Sep 26 2011