在c++中将静态数组复制到动态数组

Copying a static array to a dynamic array in c++

本文关键字:数组 复制 动态 静态 c++      更新时间:2023-10-16

我正在尝试编写一个方法,创建一个课程,并将其添加到SRS的静态数组中。然而,我的代码没有给出任何错误,但根本没有添加课程。我做错了什么?顺便说一下,球场是动态阵列。

这个代码现在是正确的:

#include "StudentReviewSystem.h"
StudentReviewSystem::StudentReviewSystem()
{
    numberOfCourses = 0;
    courses = new Course[0];
}
void StudentReviewSystem::addCourse( const int courseId, const string courseName )
{
int i = findCourse( courseId );
 if ( i == -1 )
  {
  int newNum = numberOfCourses + 1;
  Course *newCourses = new Course[newNum];
  for ( int j = 0; j < numberOfCourses; j++ )
  {
     newCourses[j] = courses[j];
  }
   Course aCourse(courseId, courseName);
   newCourses[numberOfCourses] = aCourse;
   delete []courses;
   courses = newCourses;
   numberOfCourses = newNum; 
   cout<< "Course added"<< endl;
   }
   i = findCourse(courseId);
   cout<< i;
}

谢谢大家的帮助!

代码中有几个错误。在C++中,当变量被声明为数组时,数组的大小应为cobstat表达式。因此此语句是无效的

Course newCourses [newNum];

在C/C++中,数组没有赋值运算符。所以这个代码也是无效的

courses = newCourses;

此外,您忘记更改varaibale numberOfCourses的值。Shpuld为

numberOfCourses = newNum;

此外,您可能不会在C/C++中放大数组。

应该动态分配内存,而不是使用数组。所以课程应该被定义为

Course *courses;

考虑到其他必要的变化,功能将以以下方式呈现

void StudentReviewSystem::addCourse( const int courseId, const string courseName )
{
   int i = findCourse( courseId );
   if ( i == -1 )
   {
      int newNum = numberOfCourses + 1;
      Course *newCourses = new Course[newNum];
      for ( int j = 0; j < numberOfCourses; j++ )
      {
         newCourses[j] = courses[j];
      }
      Course aCourse(courseId, courseName);
      newCourses[numberOfCourses] = aCourse;
      delete []courses;
      courses = newCourses;
      numberOfCourses = newNum; 
      cout<< "Course added"<< endl;
   }
   i = findCourse(courseId);
   cout<< i;
}
Course newCourses [newNum];

这不是有效的C++。newNum应该是一个编译时常数。

另外,我不认为可以直接将两个静态数组等同起来。

courses = newCourses;

相反,使用for循环来分配单个元素,或者更好地使用std::vector

尝试以下代码:

if(i == -1) {
        int newNum = numberOfCourses + 1;
        Course* newCourses = new Course[newNum];
        for(int j = 0; j < numberOfCourses; j++) {
            newCourses[j] = courses[j];
        }
        Course aCourse(courseId, courseName);
        newCourses[numberOfCourses] = aCourse;
        delete [] courses;
        courses = new Course[newNum];
        for(int j = 0; j < newNum; j++) {
            courses[j] = newCourses[j];
        }
        delete [] newCourses;
        cout<< "Course added"<< endl;
    }
int newNum = numberOfCourses + 1;
Course newCourses [newNum];

是不合法的c++,在您的情况下不需要从任何数组复制到另一个数组。只需使用std::vector作为类的成员,并使用其push_back方法。

你的老师向你解释了不使用std::vector的原因吗?如果没有,你最好自己思考,尽最大努力生产出好的软件,而不是黑客。实现一个动态大小的容器是可能的。如果这是家庭作业,那么就不需要编写StudentReviewSystem类,而是集中精力实现一个动态大小的数组。如果没有,那么你不应该一次重新发明两个轮子,而是专注于其中一个——StudentReviewSystem,并使用std::vector

您可以使用new []:在堆上创建数组

 Course* newCourses = new Course[newNum];

然后像你已经做的那样复制并添加新课程。别忘了delete老球场阵列

 delete [] courses;
 courses = newCourses;

并更新numberOfCourses(我认为这是您的错误)

 numberOfCourses = newNum;