- ベストアンサー
STLのvectorで作った配列をメンバ変数にする場合は。。。
C++初心者です。 STLのvectorで作った配列をメンバ変数は 以下のように宣言し、 class Array { public: vector<int> array; void Set(); } Array::Setのメンバ関数でarrayに値をセットします。 そして、メインからarrayを参照しようとしましたが 値が入っていませんでした。 メンバ変数の宣言の仕方が良くないのですか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
まず、「エラーになりました」というのは、 相手に状況が全く伝わらないため、コンピュータ系の相談では避けましょう。 代わりに、 「コンパイルが通らない」(+エラーログ添付)とか 「リンクで落ちる」(+エラーログ添付)とか、 「実行時にアクセス違反が起こる」、とか表現してみたらどうでしょうか。 ---------------------------------------- 肝心の回答ですが、 Array::Set(void)内でアクセスしているarray[0]が 存在しません。 存在しない要素にはアクセスできませんね。 (operator[]は問答無用、at()であれば例外をキャッチできます) ベタですが、↓これを追加すればとりあえず走りますよ。 vector<int> hoge; array.push_back(hoge);
その他の回答 (4)
- ddnp009
- ベストアンサー率25% (15/58)
void Array::Set(void) ローカルな Arrayオブジェクトにpush_back() しています。 あと、main() において a::Set() を呼んでません。 ArrayのコンストラクタでSet()を呼ぶか、 main() で a::Set() を呼びましょう。
- jacta
- ベストアンサー率26% (845/3158)
> void Array::Set() > { > vector<int> array; > array.push_back(1); > array.push_back(2); > } ここで、push_backを使って値を追加しているのは、あくまでも自動変数のarrayに対してであって、メンバ変数のarrayはまったく触っていません。 メンバ変数に追加したいのであれば、3行目の宣言が不要です。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>Array::Setのメンバ関数でarrayに値をセットします。 >そして、メインからarrayを参照しようとしましたが値が入っていませんでした。 の部分を補足して下さい
補足
説明不足でスミマセン。 以下のようにメインで配列のサイズを調べると 0となってしまいます。 push_backを2回行ってるので 2が返ってきて欲しいのですが... 何がいけないのでしょうか? using namespace std; class Array { public: vector<int> array; void Set(); }; void Array::Set() { vector<int> array; array.push_back(1); array.push_back(2); } int main() { Array a; cout << a.array.size() << endl; return 0; }
- takoashi
- ベストアンサー率39% (21/53)
提示してあるコードだけだとなぜダメかはわかりませんね。 void Set(); の実装を公開したほうが返信がもらいやすいかも。
補足
解決しました。ありがとうございました。 次に2次元配列をメンバ変数にした場合、エラーになってしまいました。 何がいけないのでしょうか? 重ね重ねすみませんが、よろしくお願いします。 using namespace std; class Array { public: vector<vector<int> > array; void Set(); }; void Array::Set() { array[0].push_back(1); array[0].push_back(2); } int main() { Array a; a.Set(); cout << a.array.size() << endl; return 0; }