19

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.

2
  • 1
    One of the stupid things about raw arrays in C++ is that they're not directly assignable. (I.e., the following isn't allowed. int a[10], b[10]; a = b;) Commented May 22, 2012 at 1:45
  • 1
    Since C++11 is being mentioned in this post, I'll point out std::array: std::array<int, 10> a = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }; std::array<int, 10> b = a; std::array<int, 10> c; c.fill(5); Commented May 22, 2012 at 3:43

3 Answers 3

29

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.

Sign up to request clarification or add additional context in comments.

9 Comments

You can do that? Very cool, in which standard was that added?
@derekerdmann Initializer lists were added in C++11
@derekerdmann gcc 4.5.1 supports it. I know VC++ doesn't, even in the upcoming VC11 version, not sure of about compilers.
@shengy - I believe so. At the very least, you can make a static constant that you can copy when you create a new instance.
@Prætorian, IIRC from a comment on one of my other answers, using both parentheses and an initializer list is incorrect, albeit compiling fine on GCC.
|
2

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.

1 Comment

Technically you can assign an initializer list to a variable of type std::initializer_list<T> in C++11.
-1

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

1 Comment

What is the type of Array?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.