After reading How to initialize an array in C, in particular:
Don't overlook the obvious solution, though:
int myArray[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
I tried something like this:
#include <iostream>
class Something {
private:
int myArray[10];
public:
Something() {
myArray[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
}
int ShowThingy(int what) {
return myArray[what];
}
~Something() {}
};
int main () {
Something Thing;
std::cerr << Thing.ShowThingy(3);
}
And I get:
..\src\Something.cpp: In constructor 'Something::Something()':
..\src\Something.cpp:10:48: error: cannot convert '<brace-enclosed initializer list>' to 'int' in assignment
The obvious in this case is not so obvious. I really would like the initiation of my array to be more dynamic as well.
I tired:
private:
int * myArray;
public:
Something() {
myArray = new int [10];
myArray = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
}
This looked funky to me to, and so to the compiler:
..\src\Something.cpp: In constructor 'Something::Something()':
..\src\Something.cpp:11:44: error: cannot convert '<brace-enclosed initializer list>' to 'int*' in assignment
This also did not work:
private:
int myArray[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
with:
..\src\Something.cpp:6:20: error: a brace-enclosed initializer is not allowed here before '{' token
..\src\Something.cpp:6:51: sorry, unimplemented: non-static data member initializers
..\src\Something.cpp:6:51: error: 'constexpr' needed for in-class initialization of static data member 'myArray' of non-integral type
I have been doing really good and learning what does not work, but not so good learning what does work.
So, how do I used initialization lists {value, value, value} for an array inside a class?
I have been trying to figure out how to do this for some time now and am very stuck, I have a number of these kinds of lists I need to make for my app.
3 Answers
You need to initialize the array in the constructor initialization list
#include <iostream>
class Something {
private:
int myArray[10];
public:
Something()
: myArray { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }
{
}
int ShowThingy(int what) {
return myArray[what];
}
~Something() {}
};
int main () {
Something Thing;
std::cerr << Thing.ShowThingy(3);
}
..\src\Something.cpp:6:51: sorry, unimplemented: non-static data member initializers
C++11 also adds supports for inline initialization of non-static member variables, but as the above error message states, your compiler has not implemented this yet.
Unless I'm mistaken, the initializer list is only allowed for when the variable is initialized during declaration - hence the name. You can't assign an initializer list to a variable, as you're trying to do in most of your examples.
In your last example, you're trying to add static initialization to a non-static member. If you want the array to be a static member of the class, you could try something like this:
class Derp {
private:
static int myArray[10];
}
Derp::myArray[] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
If you want to add a class member, you could try making the static array const and copy it into the member array in the constructor.
It is possible to initialize array values of the array in size the main function like this:
Array *arr2 []= {{1, 3, 5, 6, 7},20,5};