我正在尝试实现一个GradeManager类,它在内部使用一个使用new运算符动态创建的DataVector对象数组,来记录一组学生的作业成绩。
我正在努力制作构造函数/析构函数。
构造函数的描述:"这是该类的唯一构造函数,它指定了nStudents的学生数和该类的homeworks nHW数。您应该使用它们来动态设置数组大小。"
您提供的任何想法都会有很大帮助!这就是我到目前为止所拥有的。非常感谢你!!!
#include <iostream>
#include <cmath>
#include <iomanip>
//DO NOT INCLUDE ANYTHING ELSE!!
using namespace std;
typedef double DataType;//Alias for double type
typedef unsigned int UIntType;//Alias for unsigned int type
class DataVector
{
private:
DataType *m_data; //Pointer to dynamically allocated memory that holds all items
UIntType m_size; //Size of the m_data array
public:
DataVector()
{
m_data = new DataType[10];
for(int i = 0; i < 10; i++){
m_data[i]=0;
}
m_size = 10;
}
DataVector(UIntType initSize, DataType initValue)
{
int arraySize = initSize;
m_data = new DataType[arraySize];
for(int i = 0; i < arraySize; i++){
m_data[i] = initValue;
}
m_size = initSize;
}
~DataVector()
{
delete [] m_data;
m_data = NULL;
}
UIntType GetSize()
{
return m_size;
}
void Reserve(UIntType newSize)
{
int arraySize = newSize;
DataType *new_data;
new_data = new DataType[arraySize];
for(int i = 0; i < m_size; i++){
new_data[i] = m_data[i];}
m_data = new_data;
m_size = newSize;
}
};
class GradeManager
{
private:
DataVector *m_student;//m_student[0], m_student[1], etc correspond to sID 0, 1, etc respectively
UIntType m_nStudents;//Number of students
public:
GradeManager(UIntType nStudents, UIntType nHWs)
{
m_student = new DataVector[nStudents];
m_student->Reserve(nHWs);
m_nStudents = nStudents;
}
~GradeManager()
{
int numOfStudents = m_nStudents;
for(int i = 0; i < numOfStudents; i++)
delete [] m_student;
m_student = NULL;
}
};
答案 0 :(得分:0)
一些想法:
此外,构造函数/析构函数 - 在我看来,至少 - 对于GradeManager看起来很好,大多数问题实际上都在DataVector类中。
祝你好运!答案 1 :(得分:0)
我假设您不允许使用标准容器,例如std :: vector&lt;&gt;或者std :: array&lt;&gt;这可以促进这项工作。
您的DataVector构造函数和析构函数是一致的:您创建一个新的动态数组并删除动态数组。
但是在inbetween中,您可以在GradeMaster构造函数中调用函数Reserve()
。
它的for
循环可以超出范围,因为新大小可以比旧大小更大或更小。你必须检查我是否仍然在源和目标的范围内:
for (int i = 0; i < m_size && i<arraySize; i++){ // check on source and target bounds !!!
此外,您还不会释放不再需要的旧对象,从而造成内存泄漏。你必须在循环结束后插入这一行:
delete[] m_data; // insert this to avoid memory leaks
最后一点是GradeMaster析构函数。当您使用delete[]
删除整个数组时,您必须不要循环并尝试多次删除该数组!删除数组将删除其所有元素。只需删除for行。