C++ Initializing Non-Static Member Array

前端 未结 9 787
独厮守ぢ
独厮守ぢ 2020-12-03 11:18

I am working on editing some old C++ code that uses global arrays defined like so:

int posLShd[5] = {250, 330, 512, 600, 680};
int posLArm[5] = {760, 635, 51         


        
相关标签:
9条回答
  • 2020-12-03 11:24

    Leave the globals in the code and then initialize the local arrays with memcpy(), copying the contents of the global arrays to the local ones.

    0 讨论(0)
  • 2020-12-03 11:25
    // class definition with incomplete static member could be in a header file
    Class Robot {
        static const int posLShd[5];
    ....
    // this needs to be placed in a single translation unit only
    const int Robot::posLShd[5] = {250, 330, 512, 600, 680};
    
    0 讨论(0)
  • 2020-12-03 11:32

    Am I missing something here? The code below works. Simply declare the members, and initialize right away.

    #include <iostream>
    
    class Robot {
      public:
      int posLShd[5] = {250, 330, 512, 600, 680};
      int posLArm[5] = {760, 635, 512, 320, 265};
      int posRShd[5] = {765, 610, 512, 440, 380};
      int posRArm[5] = {260, 385, 512, 690, 750};
      int posNeck[5] = {615, 565, 512, 465, 415};
      int posHead[5] = {655, 565, 512, 420, 370};
      public:
        Robot() {}
        ~Robot() {}
    };
    
    int main () {
      Robot obj;
      for (int i = 0;i < 5;i++) {
        std::cout << obj.posRArm[i] << std::endl;
      }
    }
    
    0 讨论(0)
  • 2020-12-03 11:33

    This is only slightly related to the present question, but is a special case that fully addresses a duplicate.

    Zero initialization is a special case for arrays in C++ language. If the initialization list is shorter than the array, the remaining elements are zero initialized. For example, the requirement for the duplicate question was to zero initialize all members of the class including all elements of the last array in constructor:

    class myprogram {
    public:
        myprogram ();
    private:
        double aa,bb,cc;
        double G_[2000];
    };
    

    This is enough for the constructor definition:

    myprogram::myprogram():aa(0.0),bb(0.0),cc(0.0), G_{0.} {}
    

    because the first element of G_ is explicitely initialized to the value 0. and all the other elements are zero initialized.

    0 讨论(0)
  • 2020-12-03 11:39

    Is there any way to do this other than assigning each element one by one?

    If you wish to fill all the elements of array with some default values, std::fill can be used.

    #include <algorithm>
    
    // ...
    Robot::Robot()
    {
        std::fill(posLShd, posLShd+5, 13 ) ; // 13 as the default value
    
        // Similarly work on with other arrays too.
    }
    

    If each element of the array needs to be filled with a different value, then assigning value at each index is the only option.

    0 讨论(0)
  • 2020-12-03 11:41

    If your requirement really permits then you can make these 5 arrays as static data members of your class and initialize them while defining in .cpp file like below:

    class Robot
    {
      static int posLShd[5];
      //...
    };
    int Robot::posLShd[5] = {250, 330, 512, 600, 680}; // in .cpp file
    

    If that is not possible then, declare this arrays as usual with different name and use memcpy() for data members inside your constructor.

    Edit: For non static members, below template style can be used (for any type like int). For changing the size, simply overload number of elements likewise:

    template<size_t SIZE, typename T, T _0, T _1, T _2, T _3, T _4>
    struct Array
    {
      Array (T (&a)[SIZE])
      {
        a[0] = _0;
        a[1] = _1;
        a[2] = _2;
        a[3] = _3;
        a[4] = _4;
      }
    };
    
    struct Robot
    {
      int posLShd[5];
      int posLArm[5];
      Robot()
      {
        Array<5,int,250,330,512,600,680> o1(posLShd);
        Array<5,int,760,635,512,320,265> o2(posLArm);
      }
    };
    

    C++11

    The array initialization has now become trivial:

    class Robot
    {
       private:
           int posLShd[5];
           ...
       public:
           Robot() : posLShd{0, 1, 2, 3, 4}, ...
           {}
    };
    
    0 讨论(0)
提交回复
热议问题