web-dev-qa-db-ja.com

C ++オブジェクトで配列を初期化する方法

読んだ後 Cで配列を初期化する方法 、特に:

ただし、明らかな解決策を見落とさないでください。

int myArray [10] = {5、5、5、5、5、5、5、5、5、5};

私はこのようなことを試みました:

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

そして私は得る:

..\src\Something.cpp: In constructor 'Something::Something()':
..\src\Something.cpp:10:48: error: cannot convert '<brace-enclosed initializer list>' to 'int' in assignment

この場合の明白なことはそれほど明白ではありません。アレイの開始もより動的にしたいと思います。

私は疲れました:

private:
    int * myArray;

public:
    Something() {
            myArray = new int [10];
            myArray = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
}

これは私にはファンキーに見え、コンパイラーにもそう見えました。

..\src\Something.cpp: In constructor 'Something::Something()':
..\src\Something.cpp:11:44: error: cannot convert '<brace-enclosed initializer list>' to 'int*' in assignment

これも機能しませんでした:

private:
int myArray[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };

と:

 ..\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

私は本当に良いことをして、何がうまくいかないかを学んでいますが、何がうまくいくかを学ぶのはそれほど良くありません。

では、クラス内の配列に初期化リスト{value、value、value}を使用するにはどうすればよいですか?

私はこれを行う方法をしばらくの間理解しようとしていて、非常に行き詰まっています。アプリ用に作成する必要のあるこれらの種類のリストがいくつかあります。

7
Quade2002

コンストラクタ初期化リストで配列を初期化する必要があります

#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:申し訳ありませんが、実装されていません:非静的データメンバー初期化子

C++ 11では、非静的メンバー変数のインライン初期化のサポートも追加されていますが、上記のエラーメッセージに示されているように、コンパイラーはまだこれを実装していません。

20
Praetorian

私が間違っていない限り、初期化子リストは、宣言中に変数が初期化される場合にのみ許可されます。したがって、この名前が使用されます。ほとんどの例でやろうとしているように、初期化子リストを変数に割り当てることはできません。

最後の例では、静的初期化を非静的メンバーに追加しようとしています。配列をクラスの静的メンバーにしたい場合は、次のように試すことができます。

class Derp {
private:
    static int myArray[10];
}

Derp::myArray[] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };

クラスメンバーを追加する場合は、静的配列constを作成して、コンストラクターのメンバー配列にコピーしてみてください。

1
derekerdmann