2011-12-06 10 views
0

私はオブジェクトの動的ベクトルを生成し、別のクラスでそれを操作する ためにそれを返す必要があるオブジェクトへのポインタの配列:(..オブジェクトへのポインタの配列を管理するには?

に問題がある。以下のコードでありますそれを継承し をインスタンス化することができる抽象的でCarArrivalある Eventクラス

生成し、私はこの機能を持っている配列を埋めるクラスインサイド:。

Event** EventGenerator::getEvents() { 

Event* cars[EVENTS]; 

for (int i=0; i<EVENTS; i++) { 
    cars[i] = new CarArrival(generator->getNextNumber(8,(float)sqrt(0.4))); 
} 

sort(cars, cars+(EVENTS), Event::cmp); 

return cars; 

}

私は、このようにontherクラスでこの関数を呼び出します。私は、「セグメンテーション違反」を取得する最初の要素の印刷後


Event** cars = generator->getEvents(); 

for(int i=0; i<EVENTS; i++) { 
    cout << i <<":" << (*cars)[i]->getScheduleTime() << endl; 
} 

私はいくつかのことをオンラインで読んできましたが、(* cars)は という配列の最初の要素へのポインタを評価しているので間違いがあることを理解しています。 2番目のクラスの配列のすべての要素にアクセスする方法を理解します。

どうすればこの問題に直面することができますか?すべての

おかげで、

アルベルト

+0

は、「私は動のを生成する必要が**ベクトル**オブジェクトの」...うーん、唯一あった場合、 'のstd :: vector' ...あなたが本当にしなければならない場合、 –

+0

はポインタのみを使用します。可能な限りSTLを使用してください。十分にテストされており、多くの問題を解決します。 – hochl

答えて

5

私はあなたの代わりにstd::vector<Event*>を使用することをお勧めしたいです。あなたはこのように多くの苦痛を救うでしょう。それは、バックグラウンドですべての厄介なメモリ管理を処理し、あなたはそれに任意の数の項目を簡単に押すことができます。あなたの場合の最良の部分は、通常の配列では安全でないreturnvectorです。

Event* cars[EVENTS];もあなたのローカルで宣言されています。完了したら、それは存在しなくなります。かもしれないあなたのSegfaultを引き起こします。アレイをnewで動的に割り当てる必要がありますが、それでもstd::vectorで試してみてください(documentation hereを参照)。

EDIT:使用例:

std::vector<Event*> EventGenerator::getEvents() { 
    std::vector<Event*> cars; 
    for (int i=0; i<EVENTS; i++) { 
     cars.push_back(new CarArrival(generator->getNextNumber(8,(float)sqrt(0.4)))); 
    } 

    sort(cars.begin(), cars.end(), Event::cmp); 

    return cars; 
} 

std::vector<Event*> cars = generator->getEvents(); 

for(int i=0; i<cars.size(); i++) { 
    cout << i <<":" << (*cars)[i]->getScheduleTime() << endl; 
} 
+0

ありがとうございました! – kappaalby

2

ではなく、生のポインタのvector<Event*>またはvector<shared_ptr<Event>>を返すために、より良いと思いませんか?あなたが得るでしょう。この方法:メモリ管理の

  1. オートメーション
  2. 内蔵の代わりに固定1
2

の長さConstantinuisによってmentionnedとして、あなたはポインタの値を返すされているとの動的な配列getEvents()関数(スタックに割り当てられている)のスコープ内でのみ有効なメモリ位置に移動します。あなたは次回にセグメンテーションを受けるつもりです。

この配列のメモリをヒープに割り当てたいと思うかもしれません(C++があまりにも錆びていない場合は 'new'を使います)、後でメモリを解放する必要があります。

http://www.linuxtopia.org/online_books/programming_books/thinking_in_c++/Chapter13.html

+0

良い、私はfotureの使用のためのこの助けを通して!ありがとう! – kappaalby

3

私は、動的にオブジェクトに割り当てへのポインタの動的なベクトルを処理するためのクリーンな方法がuse a boost::ptr_vectorにあると信じています。それは、ポインタを格納するためのスペースの割り当て、およびその後のそれらのポインタの削除を含む、必要なものすべてを処理します。