468,512 Members | 1,408 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 468,512 developers. It's quick & easy.

Array data members initialization

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.

Sep 11 '06 #1
8 7016

iluvatar wrote:
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;
}

Sep 11 '06 #2

"iluvatar" <wo******@gmail.comwrote in message
news:11**********************@d34g2000cwd.googlegr oups.com...
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

Sep 11 '06 #3
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.

--

Frederick Gotham
Sep 11 '06 #4
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 Gotham wrote:
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.

--

Frederick Gotham
Sep 12 '06 #5
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;
}

--

Frederick Gotham
Sep 12 '06 #6
iluvatar wrote:
Thank you Frederick.

Please don't top-post. Your replies belong following or interspersed
with properly trimmed quotes. See the majority of other posts in the
newsgroup, or the group FAQ list:
<http://www.parashift.com/c++-faq-lite/how-to-post.html>

Brian
Sep 12 '06 #7
iluvatar wrote:
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-lit....html#faq-34.1) and an
initializer helper class:

#include <vector>
using namespace std;

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

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

Cheers! --M

Sep 12 '06 #8
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 Gotham wrote:
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;
}

--

Frederick Gotham
Sep 13 '06 #9

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

9 posts views Thread by J. Campbell | last post: by
2 posts views Thread by Fred Zwarts | last post: by
4 posts views Thread by Stephen Mayes | last post: by
3 posts views Thread by Eric Laberge | last post: by
11 posts views Thread by Geoff Cox | last post: by
30 posts views Thread by questions? | last post: by
8 posts views Thread by redefined.horizons | last post: by
5 posts views Thread by subramanian100in | last post: by
reply views Thread by NPC403 | last post: by
1 post views Thread by fmendoza | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.