我有一个动态数组成员的类(我在pastebin发布了我的代码)我想知道我的两个类是否正确以及它们是否有任何问题?另外我需要编写(41行)一个将类Student
设置为StudentsDynamicArray
的函数?
这是我的数组类
class StudentsDynamicArray{
private:
Student *Stud;// students dynamic array
int n; // current size of array
int nmax; // max size of array
public:
StudentsDynamicArray():n(0), Stud(NULL), nmax(0){}
StudentsDynamicArray(int n):
n(n){}
~StudentsDynamicArray(); // destructor
void SetStud(Student S){Stud[n++] = S;} // I get error when I try to set String or Int. //How I need to change this?
Student GetStud(int i){return Stud[i];}
void IncreaseSize(int ns);
};
//Function which change size of array
void Student::ChangeSize(int kiek){
if(kiek > nmax){
int *SNEW = new int[kiek];
for(int i=0; i<n; i++)
SNEW[i] = mark[i];
delete [] mark;
mark = SNEW;
nmax = kiek;
}
else if(kiek < nmax){
int *SNEW = new int[kiek];
for(int i=0; i<n; i++)
SNEW[i] = mark[i];
delete [] mark;
mark = SNEW;
n = nmax = kiek;
}
}
答案 0 :(得分:0)
在学生班,你有
int *mark
这表明您必须应用rule of three:复制构造函数,赋值运算符和析构函数。前两个应该制作动态数组的副本,而析构函数应该释放内存。您只有正确实现了析构函数。这同样适用于StudentsDynamicArray类。
至于:
void SetStud(Student S){Stud[n++] = S;}
从您的代码中看起来您最初没有调用IncreaseSize,一旦调用SetStud,Stud可能为NULL。您可以通过在构造函数中调用它来修复它:
StudentsDynamicArray():n(0), Stud(NULL), nmax(0){ IncreaseSize(10); }
另外,如果您使用std :: vector,则上述所有内容都不是必需的,因此如果您不需要这样的低杠杆动态数组,那么请使用std :: vector。然后你会使用rule of zero。
[编辑]
您的复制构造函数/赋值运算符应如下所示:
Student (const Student& other) {
// here allocate this->mark to be the same size as in other
// copy values from other.mark to this->mark
// also copy other values from `other` to this
}
Student& operator= (const Student& other)
{
// here allocate this->mark to be the same size as in other
// copy values from other.mark to this->mark
// also copy other values from `other` to this
return *this;
}
正如你所看到的,他们“非常”相似。三维规则的Wiki实际上更新为C ++ 11,您可以在其中添加移动语义,通过值操作提高复制效率(实际上称为五条规则)。如果你正在学习基础知识,你可以遵守以前的规则。
答案 1 :(得分:0)
您最好使用std::vector
将学生包装成一个集合。这将大大提高性能,并减少错误。
以下是您可以使用的课程原型。
class Student
{
private:
string mName;
unsigned int mAge;
public:
Student() : mName(""), mAge(0) {}
Student( string name, unsigned int age ) : mName(name), mAge(age) {}
string get_name() const;
void set_name( string name );
unsigned int get_age() const;
void set_age( unsigned int age );
};
class Students
{
private:
vector<Student> mCollection;
public:
Students() : mCollection() { }
Students( vector<Student> &input_collection ) : mCollection( input_collection ) { }
Students &add_student( Student &s );
Students &remove_student( Student &s );
Students &remove_student( string name );
Students &remove_student( size_t index );
Students &edit_student( size_t index, string new_name, unsigned int new_age );
};
希望这有帮助。