2012-04-23 6 views
0

私は動的に作成されたオブジェクトの配列を持つクラスを作成しようとしています。私は演算子+をオーバーロードして新しいオブジェクトをオブジェクトのグループ(クラスからクラス)に追加しました。問題は、配列のデータを読み込むときに、すべての種類の大きな数値を取得することです。コードは次のとおりです。C++のオブジェクト配列の奇妙な数字

#include<iostream.h> 

class Figura { 
    public: 
     int x, y, poz; 
     int tip; //1 = punct ; 2 = dreapta; 3 = dreptunghi 
     Figura() { }; 
     Figura(const Figura&) { }; 
}; 

class Grup { 
    private: 
     int nr_elemente; 
     Figura *figuri; 
    public: 
     int i; 
     Grup(int nr_el) { 
      nr_elemente = nr_el; 
      figuri = new Figura[nr_elemente]; 
      i = 1; 
     } 
     ~Grup() {}; 
     Grup(const Grup&) {}; 
     int _nr_elemente() { 
      return i; 
     } 

     void adauga_element(Figura fig) { 
      if(i <= nr_elemente) 
       figuri[i++] = fig; 
      else 
       cout<<"Grupul a atins numarul maxim de figuri."; 
     } 

     void afiseaza_elemente() { 
      for(int j = 1; j <= i; j++) 
       cout<<"Figura nr : "<<j<<"tip: "<<figuri[j].tip<<figuri[j].x<<" "<<figuri[j].y<<" "<<figuri[j].poz; 
     } 
    friend Grup operator+(const Figura& fig1, const Figura& fig2) { 
     return fig1.poz + fig2.poz; 
    }; 
    friend Grup operator+(const Grup& gr1, const Grup& gr2) {}; 
    void operator+(const Figura& fig); 
    friend Grup operator*(const Grup& fig) {}; 

}; 

void Grup::operator+(const Figura& fig) { 
    Grup::adauga_element(fig); 
} 

class Punct : public Figura 
{ 
    public: 
     Punct(int poz) { 
      Punct::tip = 1; 
      Punct::poz = poz; 
     } 
}; 

class Segment : public Figura 
{ 
    public: 
     Segment(int poz, int x) { 
      Segment::tip = 2; 
      Segment::poz = poz; 
      Segment::x = x; 
     } 
}; 

class Dreptunghi : public Figura 
{ 
    public: 
     Dreptunghi(int poz, int x, int y) { 
      Dreptunghi::tip = 3; 
      Dreptunghi::poz = poz; 
      Dreptunghi::x = x; 
      Dreptunghi::y = y; 
     } 
}; 

void main(void) { 

    Grup gr(1); 
    Punct pct(1); 
    Segment sgm(3, 5); 

    gr + pct; 
    gr + sgm; 
    //cout<<gr.i; 
    cout<<sgm.x; 
    gr.afiseaza_elemente(); 

} 
+0

それはのように最大10〜15個の要素のために使用されます。 – BebliucGeorge

+1

figuriにはさらに多くのメモリを割り当てる必要がありますが、さらにfiguriをベクトルとして宣言する方がよいでしょう。そして、あなたは実際に[初期化リスト](http://www.cprogramming.com/tutorial/initialization-lists-c++.html)を使って調べるべきです – Joe

+0

あなたのクラスがダイナミックな配列を表現することになっているなら、 。可能であれば、独自のクラスを作る代わりに 'std :: vector'を使い、各要素を' push_back'だけ使ってください。 – chris

答えて

1

さらに簡単な例では、理解が向上します。

いずれの場合でも、問題はオブジェクトスライシングと呼ばれます。

要するに、派生オブジェクトを基本オブジェクトの配列に配置することはできません。

あなたはFIGURAへのポインタの配列であることをfiguriデータメンバーを変更することができ、問題を解決するには、次の

Figura ** figuri; 
// ... 
figuri = new Figura*[nr_elemente]; 
+0

私は上記のコードに基づいていくつかの変更を加えましたが、最後の質問が1つあります。このコードの塊をどのようにして配列にオブジェクトを追加することができますか:void add(Figura fig){figuri [i ++] = fig; } – BebliucGeorge

0

メンバーを初期化していません。あなたはコンストラクタでそれを行う必要があります。例えば

Punct pct(1); 

はメンバーのみtipposを初期化しますが、xyは、おそらく見終わるれ、ごみの値が含まれます。

また、メンバーとしてFigura *figuri;ではなく、std::vectorという動的に割り当てられた配列を使用しないでください。これにより、新しい図形を追加するときに遭遇する未定義の動作からもあなたを救うことができます。

また、デストラクタとコピーコンストラクタには実装がないことに注意してください。これはバグの原因です。

void adauga_element(Figura fig) 

オブジェクトfigが値によって渡されるので、コピーコンストラクタを実装しなければならない渡します。

+0

少し具体的にお願いしますか? – BebliucGeorge

4

0からN - 1までのアレイインデックスは、Nが配列サイズの場合に実行されます。次のコードは、境界配列アクセスの外になります:

void adauga_element(Figura fig) { 
    if(i <= nr_elemente) 
     figuri[i++] = fig; 
    else 
     cout<<"Grupul a atins numarul maxim de figuri."; 
} 

変更するには:

if(i < nr_elemente) 

afiseaza_elemente()で同じ問題。

動的にメンバーを割り当てたので、デストラクタは動的に割り当てられた配列であり、コピーコンストラクタと代入演算子を正しく実装する必要があります。または、コピーを防ぐためにprivateと宣言してください。これはC++であるため、配列の代わりにstd::vector<Figura>を使用することを検討してください。

+0

... 'print'メソッド(つまり、 'afiseaza_elemente')でも同じ問題があります。 –