2016-10-01 11 views
0

私はポインタの配列がありますどのようにポインタの配列内のオブジェクトを挿入するために

Hotel *hotels[size]; 
    for (int i = 0; i < size; ++i) 
    hotels[i] = new Hotel(); 

をそして私は私が知っている名前を持ついくつかのオブジェクトの後に、この配列内のオブジェクトを挿入する:

cin >> tmp_name; 
for (int i = 0; i < size; i++) { 
    if (hotels[i]->get_name() == tmp_name) { 
    hotels[size] = new Hotel(); 
    size += 1; 
    Hotel *tmp_hotel; 
    tmp_hotel = hotels[i+1]; 
    hotels[i+1]->fillHotel(); 
    for (i = i + 2; i < size; i++) { 
     hotels[i] = tmp_hotel; 
     tmp_hotel = hotels[i+1]; 
    } 
    break; 
    } 
} 

私は間違っていますか?

UPD: 私のソリューション:

cin >> tmp_name; 
for (int i = 0, j = 0; i < size; i++, j++) { 
    new_hotels[j] = hotels[i]; 
    if (hotels[i]->get_name() == tmp_name) { 
     new_hotels[j+1]->fillHotel(); 
     ++j; 
     system("clear"); 
    } 
} 

hotels[size] = new Hotel(); 
++size; 
for (int i = 0; i < size; i++) { 
    hotels[i] = new_hotels[i]; 
} 
+0

あなたが持っている問題は何ですか?コードがクラッシュしますか(私はそう思っていますが、 'size'を増やしても配列にはもっと多くの記憶領域を割り当てるわけではありません)、正しい結果は得られませんか、コンパイルされませんか? – UnholySheep

+5

これは、JavaからC++へのほぼリテラルな翻訳によく似ています。それは良くないね。裸のポインタと 'new'で問題に陥るのではなく' std :: vector'を使います。私はまた、あなたが実行時に配列の長さを指定することができ、あなたのオブジェクトを決して '削除 'しないという、非標準のGCC拡張を使っているという気持ちがあります。 –

+0

また、 'i'がループ内で最大値に達すると' hotels [i + 1] 'は範囲外になります。 –

答えて

3

私はあなたのコード内の別のエラーを表示することができます。例えば


Hotel *hotels[size]; 

size定数式と何か私はこのようなケースではありません考えてみましょうする必要があります。 VLAは、C++標準の一部ではありません。要するに、スタック上にダイナミックメモリを割り当てることはできません。適切な初期化は次のようになります。

Hotel* hotels = new Hotel*[size]; 

ループ内の行:あなたが実際にあなたの配列の境界外にアクセスしている

hotels[size] = new Hotel(); 

sizeインデックスが含まれていないいくつかのメモリであり、あなたの配列との定義されていない動作が生成されます。


もう一つの奇妙なラインは以下の通りです:

size += 1; 

sizeが一定ではなく、あなたは、単にその変数を変更するベクトルのあなたのサイズを大きくすることはできません確認事実にもかかわらず。実際には変数sizeを変更していますが、配列に割り当てられたメモリは同じになります。


解決方法

アレイのサイズを増やす(または変更する)には、ほとんどの場合、の新しい配列を作成し、古いものをコピーしてください。あなたのケースでは、オブジェクト全体ではなくポインタだけをコピーする必要があるため、ソリューションはかなり妥当です。

S.Oについて多くの質問があります。このトピックは、たとえばhereです。それにもかかわらず

、私は強くは、あなたが最も実用的な代替手段を使用することをお勧め、それは本当のC++コードを使用することです。

最も効率的なクラスはstd::vectorであり、動的配列を処理する方法はC++です。

最後に、std::unique_ptr<T>クラスも動的メモリとポインタを処理すると考えてください。

最終的なソリューションは、クラスになります。

std::vector<std::unique_ptr<Hotel>> hotels; 
+1

最終的な解決策は 'std :: vector 'でなければならないと思います。 –

+0

@ChristianHackl私はポインターを使用したいという事実の背後にあるあいまいな理由を知ることができません。コードレベルから、私は最も簡単な解決策が「最終的な」解決策になると確信しています。とにかく私は 'std :: unique_ptr'だけを提案して、もっとコードに匹敵するものを提案します! –