2009-03-06 6 views
33

私はポインタの配列を作成しようとしています。これらのポインタは、私が作成したStudentオブジェクトを指します。どうすればいいのですか?ポインタの配列を作成するにはどうすればよいですか?

Student * db = new Student[5]; 

しかし、その配列の各要素は、学生のオブジェクトではなく、学生のオブジェクトへのポインタです: 私が今持っていることです。おかげさまで

答えて

68
Student** db = new Student*[5]; 
// To allocate it statically: 
Student* db[5]; 
+1

どのように '学生**デシベル=新しい学生として[5]'と同じこと* [5] ''学生* DBのでしょうか?どちらか一方を使用する利点は何ですか? – damiancesar

+1

関数から配列を返すときは、配列をヒープに割り当てる必要があります。スタックに割り当てられた場合、その関数のスコープは直ちに破棄されます。 –

17
#include <vector> 
std::vector <Student *> db(5); 
// in use 
db[2] = & someStudent; 

この方法の利点は、あなたが割り当てられたストレージの削除を心配する必要はありませんということです - ベクトルはあなたのためにそれをしません。

+0

ベクトルは、物のリストを表示するための推奨された方法ですが、厳密に言えば配列ではありません。 –

+0

これは、配列を使用できるあらゆる方法で使用できます。それがアヒルのように突っ込むと、それはアヒルです。 –

+6

ベクトルは割り当てられた記憶領域を自動的に削除することはありません_pointers_の記憶域は解放されますが、ポインタが指すメモリは解放されません。 boost :: ptr_vectorを使用してください。 –

11

ポインタの配列はポインタのポインタのように書かれている:

Student **db = new Student*[5]; 

今の問題は、あなたが唯一の5つのポインタ用にメモリを予約していること、です。したがって、Studentオブジェクト自体を作成するには、それらを繰り返し実行する必要があります。 C++で

は、ほとんどのユースケースのために命をSTDと簡単です::ベクトル。

std::vector<Student*> db; 

今、あなたはそれそれにし、[]インデックスに新しいポインタを追加するために一back()を使用することができます。 **よりも使用する方がクリーンです。

関連する問題