簡體   English   中英

C ++對象數組中的怪異數字

[英]Weird numbers in C++ array of objects

我一直在嘗試使用動態創建的對象數組來制作一個類。 我重載了運算符+,以將一個新對象添加到一組對象(類到類)中(現在僅此)。 問題是,當我讀取數組中的數據時,會得到各種各樣的大數。 這是代碼:

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

}

N是數組大小時,數組索引的范圍是0N - 1 以下代碼將導致超出范圍的數組訪問:

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>而不是數組。

一個更簡單的示例將增進理解。

無論如何,您的問題被稱為對象切片。

簡而言之,您不能將派生對象放入基礎對象數組中。

要解決該問題,您可以將figuri數據成員更改為指向Figura的指針數組:

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

您沒有初始化任何成員。 您應該在構造函數中執行此操作。

例如:

Punct pct(1);

僅初始化成員tippos ,但是xy將包含垃圾值,您可能最終會看到它們。

您也不應使用動態分配的數組作為成員Figura *figuri; 但是一個std::vector 這還將使您免於添加新圖形時遇到的不確定行為。

另外,請注意,析構函數和副本構造函數沒有實現,這是錯誤的來源。

void adauga_element(Figura fig)

傳遞對象fig是按值傳遞的,因此應實現復制構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM