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
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.
// 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};
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;
}
}
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.
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.
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);
}
};
The array initialization has now become trivial:
class Robot
{
private:
int posLShd[5];
...
public:
Robot() : posLShd{0, 1, 2, 3, 4}, ...
{}
};