我一直在尝试用动态创建的对象数组创建一个类。我重载了运算符+以向一组对象(类到类)添加一个新对象(现在只有这个)。问题是当我读取数组中的数据时,我得到了各种各样的大数字。这是代码:
#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 :(得分: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()
中的同样问题。
由于您已动态分配成员,因此析构函数必须delete[]
动态分配的数组,并且需要正确实现复制构造函数和赋值运算符,或声明private
以防止复制。由于这是C ++,请考虑使用std::vector<Figura>
而不是数组。
答案 1 :(得分:1)
一个更简单的例子可以提高理解力。
在任何情况下,您的问题都称为对象切片。
简而言之,您不能将派生对象放在基础对象数组中。
要解决此问题,您可以将figuri数据成员更改为指向Figura的指针数组:
Figura ** figuri;
// ...
figuri = new Figura*[nr_elemente];
答案 2 :(得分:0)
您没有初始化任何成员。你应该在构造函数中这样做。
例如:
Punct pct(1);
仅初始化成员tip
和pos
,但x
和y
将包含垃圾值,您可能最终会看到它们。
您也不应该将动态分配的数组用作成员 - Figura *figuri;
而是std::vector
。这样可以避免您在添加新数据时遇到的未定义行为。
另请注意,您的析构函数和复制构造函数没有实现,这是bug的来源。
void adauga_element(Figura fig)
传递对象fig
按值传递,因此应该实现复制构造函数。