0

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

#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();

}
4

3 に答える 3

4

配列インデックスは から まで実行さ0N - 1Nは配列サイズです。次のコードでは、範囲外の配列アクセスが発生します。

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()

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

于 2012-04-23T21:02:25.987 に答える
1

より単純な例が理解を深めるでしょう。

いずれにせよ、あなたの問題はオブジェクトスライスとして知られています。

つまり、派生オブジェクトをベース オブジェクトの配列に配置することはできません。

この問題を解決するには、figuri データ メンバーを変更して、Figura へのポインターの配列にします。

Figura ** figuri;
// ...
figuri = new Figura*[nr_elemente];
于 2012-04-23T21:02:34.317 に答える
0

どのメンバーも初期化していません。コンストラクタでそれを行う必要があります。

例えば:

Punct pct(1);

メンバーtipandのみを初期化しますposが、xandyにはガベージ値が含まれます。

また、動的に割り当てられた配列をメンバーとして使用するべきではありませんFigura *figuri;が、std::vector. これにより、新しい図を追加するときに発生する未定義の動作も回避できます。

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

void adauga_element(Figura fig)

オブジェクトfigは値で渡されるため、コピー コンストラクターを実装する必要があります。

于 2012-04-23T21:00:00.213 に答える