C ++类中的动态数组

时间:2014-02-28 08:54:38

标签: c++ arrays dynamic

我有一个动态数组成员的类(我在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;
         }
}

2 个答案:

答案 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 );
};

希望这有帮助。