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();
}
数组索引从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>
而不是数组。
一个更简单的例子可以提高理解。
在任何情况下,您的问题都称为对象切片。
简而言之,不能将派生对象放在基对象数组中。
要解决此问题,您可以将 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
按值传递,因此应实现复制构造函数。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 什么时候调用组成单元对象的析构函数
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- C++ 将数字添加到数组对象
- 将变量中的数字添加到对象的属性中
- 字符串中的数字总和(使用字符串对象)C++
- C++对象数组中的奇怪数字
- MFC 视觉对象C++代码来检查有效的数字条目
- 将对象从中心点缩放特定数字
- 将数字合并到对象的名称
- 重载对象前面带有数字的运算符+(int)
- 比较对象的3个数字属性
- 通过数字确定对象类型
- 类、数字/数组或对象中的对象
- 我如何重载+运算符来添加2个相同类的对象(每个有3个数字)来创建1个具有所有6个数字的对象
- 处理数字的流对象