Array data members initialization

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • iluvatar

    #1

    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::Exampl e(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.

  • amparikh@gmail.com

    #2
    Re: Array data members initialization


    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::Exampl e(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;
    }

    Comment

    • Howard

      #3
      Re: Array data members initialization


      "iluvatar" <woquendo@gmail .comwrote in message
      news:1158008373 .457907.194870@ d34g2000cwd.goo glegroups.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::Exampl e(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::Exampl e( const double & val0,
      const double & val1, const double & val2)
      {
      array[0] = val0;
      array[1] = val1;
      array[2] = val2;
      }

      -Howard



      Comment

      • Frederick Gotham

        #4
        Re: Array data members initialization

        iluvatar posted:
        Example::Exampl e(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

        Comment

        • iluvatar

          #5
          Re: Array data members initialization

          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::Exampl e(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

          Comment

          • Frederick Gotham

            #6
            Re: Array data members initialization

            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::MyClas s(double const a,double const b,double const c)
            {
            double *p = arr;

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

            --

            Frederick Gotham

            Comment

            • Default User

              #7
              Re: Array data members initialization

              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.c om/c++-faq-lite/how-to-post.html>





              Brian

              Comment

              • mlimber

                #8
                Re: Array data members initialization

                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::Exampl e(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<typena me 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<dou ble>()
                .Add(d0)
                .Add(d1)
                .Add(d2) )
                {}
                // ...
                };

                Cheers! --M

                Comment

                • iluvatar

                  #9
                  Re: Array data members initialization

                  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::MyClas s(double const a,double const b,double const c)
                  {
                  double *p = arr;
                  >
                  *p++ = a;
                  *p++ = b;
                  *p = c;
                  }
                  >
                  --
                  >
                  Frederick Gotham

                  Comment

                  Working...