Angela Kay
Angela Kay

Reputation: 45

Dynamic string array without using vector

I am working on an assignment where we have to create a "student" object with a "course" member array that is dynamic so the user can enter from one course to as many as they'd like in the array. I've been trying this every which way and just cannot get the array to resize and accept new elements. Here is my code as it stands now:

cout << "Enter student name > ";
cin >> name;

Student firstStudent(name);

cout << endl << "Enter \"done\" when you are complete";
cout << endl << "Enter a new course : ";
cin >> course;

while (course != "done") {
    numCourses++;
    firstStudent.addElement(numCourses, course);//makes the array bigger
    cout << endl << "Enter a new course : ";
    cin >> course;

}//end while

member variables and constructor:

class Student
{
private:
   string name;//name of student

   string *dynArray = new string[1];//array

public:
Student::Student(string name)
{
   this->name = name;
   this->numC = 1;//initialized to one to start with    
}

resizing and adding an element to the array:

void Student::addElement(int numCourses, string &course) {//DYNAMIC ARRAY
    if (numCourses > this->numC) {//checks if there are more courses than there is room in the array
       this->numC = numCourses; //this changes the member variable amount
       dynArray[numCourses] = course;//adds new course to array

       string *temp = new string[numC];//create bigger temp array

       temp = dynArray;//write original to temp

       delete[]dynArray; //this tells it that it's an array

       dynArray = temp;//make dynarray point to temp

    }
    else {
       dynArray[numCourses] = course;//adds new course to array
    }
}//end addElement

Even if I manage to get rid of compile errors, it will often come up with runtime errors. I'm sure it has to do with pointers/copying arrays but I'm just learning and haven't yet mastered these concepts.

Edit: dynArray[numCourses] = course; creates a char array. ie if course = "one", dynArray[0] = "o", dynArray[ 1] = "n", etc. Does anyone know how to keep this from happening?

screenshot

Upvotes: 0

Views: 747

Answers (2)

R&#255;ck N&#246;thing
R&#255;ck N&#246;thing

Reputation: 177

I'm not sure if this would be considered cheating, but here's a break down of how std::vector is implemented. You could use that as a reference and just pick out the parts you need.

http://codefreakr.com/how-is-c-stl-implemented-internally/

Upvotes: 0

znkr
znkr

Reputation: 1756

The first line that that doesn't look quite correct is this one:

dynArray[numCourses] = course;

Before it is checked that numCurses > numC, which means that dynArray[numCourses] accesses memory out of bounds (the bounds are 0 to numC - 1.

The other thing that strikes me as interesting is that the addElement method takes numCourses as an argument. I would expect that it should behave similar to std::vector<T>::push_back. Are you sure this argument is necessary?

The last thing I want to comment on is that the values from dynArray are not copied. Have a look at std::copy_n on how to do the copy.

Upvotes: 1

Related Questions