How to initialize an array in C++ objects
Asked Answered
S

3

18

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.

Synchro answered 22/5, 2012 at 1:27 Comment(2)
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;)Winnah
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);Vanir
S
28

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.

Sankey answered 22/5, 2012 at 1:37 Comment(9)
You can do that? Very cool, in which standard was that added?Boykin
@Boykin Initializer lists were added in C++11Sankey
@Boykin gcc 4.5.1 supports it. I know VC++ doesn't, even in the upcoming VC11 version, not sure of about compilers.Sankey
So does this means before C++11 myArray can only be initialized by a loop or memset function?Begot
@Begot - I believe so. At the very least, you can make a static constant that you can copy when you create a new instance.Boykin
@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.Anguiano
@Boykin I believe latest versions of clang, gcc and intel c++ have it.Winnah
@Prætorian, I found the question. Here it is: #10372558. Using ({0}) is a warning in GCC 4.7.0.Anguiano
@Anguiano You're right, gcc4.7 warns about that (warning: list-initializer for non-class type must not be parenthesized [enabled by default]); thanks for pointing it out.Sankey
B
1

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.

Boykin answered 22/5, 2012 at 1:34 Comment(1)
Technically you can assign an initializer list to a variable of type std::initializer_list<T> in C++11.Anguiano
B
-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};
Babylonian answered 14/4, 2022 at 5:53 Comment(1)
What is the type of Array?Admiral

© 2022 - 2024 — McMap. All rights reserved.