[英]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
是數組大小時,數組索引的范圍是0
到N - 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);
僅初始化成員tip
和pos
,但是x
和y
將包含垃圾值,您可能最終會看到它們。
您也不應使用動態分配的數組作為成員Figura *figuri;
但是一個std::vector
。 這還將使您免於添加新圖形時遇到的不確定行為。
另外,請注意,析構函數和副本構造函數沒有實現,這是錯誤的來源。
void adauga_element(Figura fig)
傳遞對象fig
是按值傳遞的,因此應實現復制構造函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.