#include "C_IntArray.h"
C_IntArray::C_IntArray()
{
m_Array = 0;
m_Length = 0;
}
C_IntArray::~C_IntArray(void)
{
delete m_Array;
m_Length = 0;
}
void C_IntArray::ContructorWithParater(int *intArray, int size)
{
m_Array = new int[size];
m_Length = size;
for (int i = 0; i < size; i++)
m_Array[i] = intArray[i];
}
void C_IntArray::InputArray()
{
cout << "Nhap so luong phan tu: ";
cin >> m_Length;
m_Array = new int [m_Length];
for(int i = 0; i < m_Length; i++)
{
cout << "Nhap phan tu Array[" << i << "] = ";
cin >> m_Array[i];
}
}
void C_IntArray::OutputArray()
{
for(int i = 0; i < m_Length; i++)
cout << m_Array[i] << " ";
}
C_IntArray C_IntArray::Remove(int x)
{
C_IntArray temp;
temp.ContructorWithParater(m_Array, m_Length);
temp.OutputArray();
for(int i = 0; i < temp.m_Length; i++)
{
if(temp.m_Array[i] == x)
{
{
temp.m_Length--;
for(int j = i; j < temp.m_Length; j++)
temp.m_Array[j] = temp.m_Array[j + 1];
}
}
cout << "\n";
temp.OutputArray();
}
cout << "\n";
return temp;
}
档案标题
#include <iostream>
using namespace std;
#ifndef _C_IntArray_h
#define _C_IntArray_h
class C_IntArray
{
private:
int *m_Array, m_Length;
public:
C_IntArray();
~C_IntArray();
// khoi tao tham so dau vao
void ContructorWithParater(int *, int);
void InputArray();
void OutputArray();
// xoa phan tu trung
C_IntArray Remove(int );
};
#endif _C_IntArray_h;
档案主
#include "C_IntArray.h"
void main()
{
C_IntArray a;
a.InputArray();
int giaTriCanXoa = 5;
C_IntArray b = a.Remove(giaTriCanXoa);
b.OutputArray();
cout << "\n";
a.OutputArray();
system("pause");
}
我试图调试我的项目。类中的Remove是有效的,当我调试返回temp时它仍然可以工作,但我接下来调试它返回NULL或返回1个数组 函数中删除函数不能返回temp。
如果我删除析构函数或我的temp是静态C_IntArray,我的项目就可以运行。
如果我拼错了帮助人们修复的愿望,那么谢谢你的关注。
答案 0 :(得分:0)
Remove返回类的副本,而不是指针。因此它是一个副本。 由于您没有定义复制构造函数或赋值运算符,因此您将使用默认的复制/赋值 - 这将导致m_Array被多次删除。
您可以在复制类时执行内部数组的深层复制,也可以使用写入时复制和引用计数。
即。您需要添加以下功能:
C_IntArray(C_IntArray const& other);
C_IntArray& operator=(C_IntArray const& rhs);
他们应该为数组中的数据分配新的存储空间,并从'other'或'rhs'复制元素。查找如何编写复制构造函数或赋值运算符。网上会有无数的例子。
你班上也有内存泄漏。 C_IntArray :: InputArray()将泄漏内存,因为在为其分配新内存之前不删除m_Array。
最好将自由函数用于输入职责而不是使其成为类成员 - 保持类的接口最小化和完整。
即。将它移出课堂:
void InputArray(C_IntArray& dst) {
// ...
}
正如其他人所建议的那样,只需使用std :: vector。