2016-05-22 3 views
-2

私は3つのクラスを持っています。シェイプはベースクラス、長方形、三角形です。ヒープメモリをC++で使用

派生クラスからシェイプのポインタに4つのオブジェクトを保存します。

Shape* sh1=new Shape[4]; 
Rectangle aR(2,3); 
Rectangle bR(4,5); 
Triangle aT(2,3); 
Triangle bT(4,5); 

sh1[0]=&aR; 
sh1[1]=&bR; 
sh1[2]=&aT; 
sh1[3]=&bT; 

しかし、私はこれで問題があり、 はどのように私はそれを修正することができますか?

私はこの

Shape* sh1[4]; 
Rectangle aR(2,3); 
Rectangle bR(4,5); 
Triangle aT(2,3); 
Triangle bT(4,5); 

sh1+0=&aR; 
sh1+1=&bR; 
sh1+2=&aT; 
sh1+3=&bT; 

を行うことができますが、なぜ私は最初の方法を行うことはできませんか?

+0

_'sh1の[4] = &bT; '_ UBは、両方のケースであること。覚えて –

答えて

3

Shape **sh1 = new Shape*[4];を意味します。シェイプの配列ではなく、ポインタの配列が必要です。 Shapeクラスを抽象クラスにすると、非常に有用な診断も得られるはずです。

std::vector<Shape*> sh2 = {&aR, &bR, &aT, &bT}; 
+0

おそらく 'std :: array'が良いでしょうか? –

+0

ops、thansk Shape * sh1 = new Shape [4]を使うと、コンパイラはShapeオブジェクトの4ブロックをメモリに配置し、sh1と...に最初のブロックのアドレスを送信します。 – Amirsh

+0

@EdHeal:おそらく - しかし、利点はかなり小さく、私はOPがベクトルの使い方を把握することで最も効果的だと思います。その後、リストに戻り、スタックとデキューと配列について知ることができます。 –

0

変数 "SH1" は形状へのポインタであるため、 "SH1は、[0]" Shapeがある:あなたがすべてでnewを使用して、代わりにコンテナを使用するべきではありませんもちろん

シェイプへのポインタをシェイプに割り当てることはできません。

したがって

sh1[0] = &aR 

は間違っています。

C/C++

sh1[i] is equal to *(sh+i) 

バイ

関連する問題