Search code examples
c++classdynamic-arrays

Create an dynamic array in class member function


I am trying to make a dynamic array in my member function, however, it seems to create a new dynamic array each time I call the function. Is there anyway to create a dynamic array inside a member function so it doesn't remake itself.

class predator
{
private: 
    string name; 
    string species;
protected:
    string *list;

public: 
    predator(string theSpecies);
    void killsRecorded(string kills); // add a new kill to the end of the predator's list of kills
    string *killsList();  // return a pointer to the array of all kills by this predator 
    int noOfTotalKills();  // how many kills have been recorded

    int k; 
    static int n;
};

//The header file
void predator::killsRecorded(string kills)
{
    k = 0; 
    list = new string[5];
    *(list + k) = kills;
    k = n++;
    cout<< k<< endl;
}

string* predator::killsList()
{
    //cout<< (sizeof(list)/sizeof(list[0]))<< endl;
    for(int i=0; i<5; i++)
    {
        cout<< *(list + i)<< endl;
    }
}

Above is my class and header file, void killsRecorded(string kills) should add kills to my array, however, when I try that in my main.

predator *prey;
prey = new predator("Cheetah");

prey->killsRecorded("Mouse");
prey->KillsRecorded("Donkey");

prey->killsList();

It prints out

Created a hunter that is a Cheetah
0
1
Donkey
*BLANK LINE
*BLANK LINE
*BLANK LINE
*BLANK LINE

Instead, Mouse should be in the first line and Donkey in the second. Am I doing something wrong? Also, I can't use vectors, it's for an assignment.


Solution

  • In your constructor, assign n a default value, say 5. Then create an array of that size.

    predator::predator()
        : n(5),
          k(0)
    {
        kills = new string[n];
    
    }
    

    Then recordKills checks to see if there is space in kills, reallocating if necessary:

    recordKills(string kill)
    {
        if(k >= n) {
            string* oldKills = kills;
            kills = new string[2*n];
    
            // copy
            for(int i = 0; i< n: i++) {
                kills[i] = oldKills[i];
            }
    
            n *= 2;
    
            delete [] oldKills;
        }
    
        kills[k++] = kill;
    }
    

    It's generally a bad idea to call a variable by the name of a data structure, so I renamed 'list' to 'kills'.

    Then when printing the kills, loop until k:

    string* listKills()
    {
        for(int i = 0; i < k; i++) {
            cout << kills[i] << endl;
        }
    
        return kills;
    }
    

    Remember to delete kills in the destructor!