Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Array data members initialization

Reply
Thread Tools

Array data members initialization

 
 
iluvatar
Guest
Posts: n/a
 
      09-11-2006
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.

 
Reply With Quote
 
 
 
 
amparikh@gmail.com
Guest
Posts: n/a
 
      09-11-2006

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;
}

 
Reply With Quote
 
 
 
 
Howard
Guest
Posts: n/a
 
      09-11-2006

"iluvatar" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed) 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



 
Reply With Quote
 
Frederick Gotham
Guest
Posts: n/a
 
      09-11-2006
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
 
Reply With Quote
 
iluvatar
Guest
Posts: n/a
 
      09-12-2006
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


 
Reply With Quote
 
Frederick Gotham
Guest
Posts: n/a
 
      09-12-2006
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
 
Reply With Quote
 
Default User
Guest
Posts: n/a
 
      09-12-2006
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
 
Reply With Quote
 
mlimber
Guest
Posts: n/a
 
      09-12-2006
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<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

 
Reply With Quote
 
iluvatar
Guest
Posts: n/a
 
      09-13-2006
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


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
initialization of array as a member using the initialization list aaragon C++ 2 11-02-2008 04:57 PM
Initialization of numeric (intrinsic type) data members Lionel B C++ 5 07-19-2007 02:26 PM
array initialization in initialization list. toton C++ 5 09-28-2006 05:13 PM
static initialization of array members? Peter Olcott C++ 4 05-31-2006 09:43 PM
Initialization of data members Dave Theese C++ 3 09-16-2003 10:01 PM



Advertisments