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

时间:2013-11-19 09:26:34

标签: c++ arrays

我正在尝试编写一个创建课程的方法,并将其添加到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;
}

感谢大家的帮助!

4 个答案:

答案 0 :(得分:1)

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;
    }

答案 1 :(得分:1)

代码中有几个错误。在C ++中,当变量声明为数组时,数组的大小应为cobstabt表达式。所以这个陈述无效

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;
}

答案 2 :(得分:0)

int newNum = numberOfCourses + 1;
Course newCourses [newNum];

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

您的老师是否向您解释了不使用std::vector的原因?如果没有,你最好自己思考并尽力制作好的软件而不是黑客。可以实现动态大小的容器。它是家庭作业任务,然后没有必要编写StudentReviewSystem类,而是专注于实现动态大小的数组。如果没有,那么你不应该一次重新发明两个轮子,而是专注于一个 - StudentReviewSystem,然后使用std::vector

答案 3 :(得分:0)

您可以使用new []

在堆上创建数组
 Course* newCourses = new Course[newNum];

然后按照您的方式复制并添加新课程。 不要忘记delete旧课程数组

 delete [] courses;
 courses = newCourses;

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

 numberOfCourses = newNum;