Array data members initialization

I

iluvatar

Hi all.

How can I initialize an array data member in the "faster" way? For
example, suppose I have a class like

class Example{
private:
double array[3];
public:
Example(const double & val0, const double & val1, const double &
val2); // yes, with doubles
...
};

and I want to write for the constructor something like

Example::Example(const double & val0, const double & val1, const double
& val2)
: array[0](val0), array[1](val1), array[2](val2)
{}

but obviously it does not work for me. I dont know what is the correct
syntax for the initialization, and if the member double array[3] MUST
be initialized with an array and no member by member as I did. Please
help me. Thank you. I am sorry for my English. Thank you again.
 
A

amparikh

iluvatar said:
Hi all.

How can I initialize an array data member in the "faster" way? For
example, suppose I have a class like

class Example{
private:
double array[3];
public:
Example(const double & val0, const double & val1, const double &
val2); // yes, with doubles
...
};

and I want to write for the constructor something like

Example::Example(const double & val0, const double & val1, const double
& val2)
: array[0](val0), array[1](val1), array[2](val2)
{}

but obviously it does not work for me. I dont know what is the correct
syntax for the initialization, and if the member double array[3] MUST
be initialized with an array and no member by member as I did. Please
help me. Thank you. I am sorry for my English. Thank you again.

Pass a reference to an array and use a reference to an array as a
member of you class.

class Example{
private:
const double (&array1) [3];
public:
Example( const double (&arr)[3]) : array1(arr)
{
}
};

int main(){
const double arrd[3] = { 3.0, 2.0, 1.0};
Example e(arrd);
return 0;
}
 
H

Howard

iluvatar said:
Hi all.

How can I initialize an array data member in the "faster" way?

Faster in what sense?
For example, suppose I have a class like

class Example{
private:
double array[3];
public:
Example(const double & val0, const double & val1, const double &
val2); // yes, with doubles
...
};

and I want to write for the constructor something like

Example::Example(const double & val0, const double & val1, const double
& val2)
: array[0](val0), array[1](val1), array[2](val2)
{}

but obviously it does not work for me. I dont know what is the correct
syntax for the initialization, and if the member double array[3] MUST
be initialized with an array and no member by member as I did. Please
help me. Thank you. I am sorry for my English. Thank you again.

You could use assignments in the constructor body:

Example::Example( const double & val0,
const double & val1, const double & val2)
{
array[0] = val0;
array[1] = val1;
array[2] = val2;
}

-Howard
 
F

Frederick Gotham

iluvatar posted:
Example::Example(const double & val0, const double & val1, const double
& val2)
: array[0](val0), array[1](val1), array[2](val2)
{}


Take those parameters by value, not by reference -- a "double" doesn't
consume enough memory to warrant passing around its address rather than its
actual value. (Then again, your compiler might just compile as if you had
passed by value...)

You have stumbled across a defect in C++. When writing the C++ Standard,
the committee members focused all of their attention on adding new features
to the language, and neglected to refine the more basic features. We
_should_ be able to do something akin to the following:

class MyClass {
private:

double const arr[3];

public:

MyClass(double const a,double const b,double const c)
: arr( {a,b,c} )
{
/* Function Body */
}
};

, but alas we can't. The Standards Committee are apathetic when it comes to
remedying fundamental defects of this nature, so the defect may never be
resolved.

A possible solution might be to use compound literals (which are a feature
of C99):

: arr( (double[3]){a,b,c} )

Strictly speaking, they're not supported by C++, but most C++ compilers
support features of C99.
 
I

iluvatar

Thank you Frederick. I use the gnu g++ compiler and the arr(
(double[3]){a,b,c} ) does not work. But the most important fact now is
your point of the lack for options such arr( {a,b,c} ) in the actual
standard. I will try to change my code to three data members replacing
the array. Bye.

Frederick said:
iluvatar posted:
Example::Example(const double & val0, const double & val1, const double
& val2)
: array[0](val0), array[1](val1), array[2](val2)
{}


Take those parameters by value, not by reference -- a "double" doesn't
consume enough memory to warrant passing around its address rather than its
actual value. (Then again, your compiler might just compile as if you had
passed by value...)

You have stumbled across a defect in C++. When writing the C++ Standard,
the committee members focused all of their attention on adding new features
to the language, and neglected to refine the more basic features. We
_should_ be able to do something akin to the following:

class MyClass {
private:

double const arr[3];

public:

MyClass(double const a,double const b,double const c)
: arr( {a,b,c} )
{
/* Function Body */
}
};

, but alas we can't. The Standards Committee are apathetic when it comes to
remedying fundamental defects of this nature, so the defect may never be
resolved.

A possible solution might be to use compound literals (which are a feature
of C99):

: arr( (double[3]){a,b,c} )

Strictly speaking, they're not supported by C++, but most C++ compilers
support features of C99.
 
F

Frederick Gotham

iluvatar posted:
Thank you Frederick. I use the gnu g++ compiler and the arr(
(double[3]){a,b,c} ) does not work.


It works for _me_ on g++. Maybe you need to upgrade your compiler?

But the most important fact now is your point of the lack for options
such arr( {a,b,c} ) in the actual standard. I will try to change my code
to three data members replacing the array. Bye.


If the array is non-const, you can simply put the code in the constructor
body:

MyClass::MyClass(double const a,double const b,double const c)
{
double *p = arr;

*p++ = a;
*p++ = b;
*p = c;
}
 
M

mlimber

iluvatar said:
How can I initialize an array data member in the "faster" way? For
example, suppose I have a class like

class Example{
private:
double array[3];
public:
Example(const double & val0, const double & val1, const double &
val2); // yes, with doubles
...
};

and I want to write for the constructor something like

Example::Example(const double & val0, const double & val1, const double
& val2)
: array[0](val0), array[1](val1), array[2](val2)
{}

but obviously it does not work for me. I dont know what is the correct
syntax for the initialization, and if the member double array[3] MUST
be initialized with an array and no member by member as I did.

Use a vector instead of an array (cf.
http://www.parashift.com/c++-faq-lite/containers.html#faq-34.1) and an
initializer helper class:

#include <vector>
using namespace std;

template<typename T>
class Initializer
{
vector<T> v_;
public:
Initializer& Add( const T& t ) { v_.push_back(t); return *this; }
operator vector<T>() const { return v_; }
};

class Example
{
const vector<double> v_;
public:
Example( double d0, double d1, double d2 )
: v_( Initializer<double>()
.Add(d0)
.Add(d1)
.Add(d2) )
{}
// ...
};

Cheers! --M
 
I

iluvatar

Ohh, sorry. I was making a mistake. The (double[3]){a,b,c} ) also works
for me. But is more slow than the initial option. Bye

Frederick said:
iluvatar posted:
Thank you Frederick. I use the gnu g++ compiler and the arr(
(double[3]){a,b,c} ) does not work.


It works for _me_ on g++. Maybe you need to upgrade your compiler?

But the most important fact now is your point of the lack for options
such arr( {a,b,c} ) in the actual standard. I will try to change my code
to three data members replacing the array. Bye.


If the array is non-const, you can simply put the code in the constructor
body:

MyClass::MyClass(double const a,double const b,double const c)
{
double *p = arr;

*p++ = a;
*p++ = b;
*p = c;
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,756
Messages
2,569,540
Members
45,025
Latest member
KetoRushACVFitness

Latest Threads

Top