www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Default constructor for structs

reply Peter Alexander <peter.alexander.au gmail.com> writes:
Since default constructors for structs are not allowed, how do I go 
about making all the elements of this Matrix struct default to zero? 
(floats default to nan by default).

struct Matrix(int M, int N)
{
	float[M][N] elements;
}

Matrix(3, 3) m;
assert(m[0][0] == 0);

?
Aug 07 2010
next sibling parent reply bearophile <bearophileHUGS lycos.com> writes:
Peter Alexander:
 Since default constructors for structs are not allowed, how do I go 
 about making all the elements of this Matrix struct default to zero? 
 (floats default to nan by default).
This doesn't work, I don't know why: float[M][N] elements = 0.0; A bad looking solution: struct Matrix(int M, int N) { float[M][N] elements; static Matrix opCall() { Matrix m; foreach (ref row; m.elements) row[] = 0.0; return m; } } void main() { auto m = Matrix!(3, 3)(); assert(m.elements[0][0] == 0); } A possible solution avoids going against the language (the default nan value for FP values isn't there for show, it's there because it improves your code): struct Matrix(int M, int N) { float[M][N] elements; this(float init=0) { foreach (ref row; elements) row[] = init; } } void main() { auto m = Matrix!(3, 3)(0.0); assert(m.elements[0][0] == 0); } This doesn't work: struct Matrix(int M, int N) { float[M][N] elements; this(float init=0.0) { foreach (ref row; elements) row[] = init; } } void main() { auto m = Matrix!(3, 3)(); assert(m.elements[0][0] == 0); } Bye, bearophile
Aug 07 2010
parent Peter Alexander <peter.alexander.au gmail.com> writes:
On 7/08/10 3:44 PM, bearophile wrote:
 Peter Alexander:
 <snip>

 Bye,
 bearophile
Thanks for your detailed reply. However, I'm not particularly satisfied with any of those :( I have already gone with the single parameter init constructor in my code until I find something better, but really, I just want the matrix to be default initialised to zeroes without having to explicitly specify it in client code. Initialising to NaNs is highly unintuitive (especially since ints auto-initialise to 0...) and this has already caused me unnecessary grief. I understand the reasoning, and I might agree with it if it wasn't forced on you...
Aug 07 2010
prev sibling parent reply rouge <rouge gmail.com> writes:
Hi, I'm a newbie, hope the attached example works for you.

Peter Alexander wrote:
 Since default constructors for structs are not allowed, how do I go 
 about making all the elements of this Matrix struct default to zero? 
 (floats default to nan by default).
 
 struct Matrix(int M, int N)
 {
     float[M][N] elements;
 }
 
 Matrix(3, 3) m;
 assert(m[0][0] == 0);
 
 ?
Aug 07 2010
parent rouge <rouge gmail.com> writes:
oops :p correction:
in template Zero
const float[M][N] ==> const T[M][N]

rouge wrote:
 Hi, I'm a newbie, hope the attached example works for you.
 
 Peter Alexander wrote:
 Since default constructors for structs are not allowed, how do I go 
 about making all the elements of this Matrix struct default to zero? 
 (floats default to nan by default).

 struct Matrix(int M, int N)
 {
     float[M][N] elements;
 }

 Matrix(3, 3) m;
 assert(m[0][0] == 0);

 ?
Aug 07 2010