Search code examples
c++arraysclassobjectexpand

Expanding memory in a dynamically allocated pointer array


I am trying to make my array expand when I add an object. But it will not work. I have been searching and searching but can not find the problem... It do not think it will be a hard task for a trained eye, so I thought I could ask you guys. I have two classes, where the class Timber is linked to TimberRegister, but Timber can not see TimberRegister while TimberRegister can see it. I think it should be enough to show you the cppfile of the TimberRegister and the main file, because I am pretty sure the other files are okey and should not affect the error, which seems to be that toString cant write the third object because there are no memory for it.

#include "timberRegister.h"
#include <iostream>

int main() {

    TimberRegister oak("Oak");
    oak.addTimber("20x10", 4, 10.50);
    oak.addTimber("28x14", 4, 15.00);
    oak.addTimber("15x5", 2, 5);

    int nrOf = oak.getNrOfTimber();
    string* str = new string[nrOf];
    oak.getTimberAsString(str, nrOf);
    cout << oak.getTitle() << endl;
    for (int i = 0; i < nrOf; i++) {
    cout << str[i] << endl;
    }

    return 0;
}
#include "timberRegister.h"

void TimberRegister::expand() {
    this->capacity += 10;
    Timber* *tmp = new Timber*[capacity];

    for (int i = 0; i < this->nrOfTimber; i++) {
        tmp[i] = this->timber[i];
    }
    delete[] this->timber;
    this->timber = tmp;
    this->initiate(this->nrOfTimber);
 }

 void TimberRegister::initiate(int from) {
     for (int i = 0; i < this->capacity; i++) {
        this->timber[i] = nullptr;
     }
 }

 void TimberRegister::freeMemory() {
 for (int i = 0; i < this->nrOfTimber; i++) {
        delete this->timber[i];
 }
    delete[] this->timber;
 }

 int TimberRegister::find(string dimension, int meters, double price) {
    int place = -1;
    Timber tmp(dimension, meters, price);

for (int i = 0; i < this->nrOfTimber && place == -1; i++) {
    if (*this->timber[i] == tmp) {
        place = i;
    }
}
return place;
}

TimberRegister::TimberRegister(string title) {
this->title = title;
this->nrOfTimber = 0;
this->capacity = 2;
this->timber = new Timber*[this->capacity];
for (int i = 0; i < capacity; i++) {
    this->timber[i] = nullptr;
}
this->initiate(this->nrOfTimber);
}

TimberRegister::TimberRegister(const TimberRegister &origObj) {
if (this != &origObj) {
    this->title = origObj.title;
    this->nrOfTimber = origObj.capacity;
    this->timber = new Timber*[origObj.capacity];
    for (int i = 0; i < origObj.nrOfTimber; i++) {
        this->timber[i] = new Timber(*origObj.timber[i]);
    }
    this->initiate(origObj.getNrOfTimber());
}
}

TimberRegister::~TimberRegister() {
this->freeMemory();
}

TimberRegister TimberRegister::operator=(const TimberRegister & origObj) {
this->freeMemory();

this->title = origObj.title;
this->nrOfTimber = origObj.nrOfTimber;
this->capacity = origObj.capacity;
this->timber = new Timber*[origObj.capacity];
for (int i = 0; i < origObj.capacity; i++) {
    this->timber[i] = new Timber(*origObj.timber[i]);
}
this->initiate(origObj.getNrOfTimber());

return *this;
}

bool TimberRegister::addTimber(string dimension, int meters, double price) {
bool added = false;

if (this->existTimber(dimension, meters, price) == false) {
    if (this->nrOfTimber >= this->capacity) {
        this->expand();
    }
    this->timber[nrOfTimber++] = new Timber(dimension, meters, price);
    added = true;
}
return added;
}

bool TimberRegister::removeTimber(string dimension, int meters, double    price) {
bool removed = false;
int tmp = -1;
tmp = this->find(dimension, meters, price);

if (tmp != -1) {
    delete this->timber[tmp];
    this->timber[tmp] = this->timber[--this->nrOfTimber];
    removed = true;
}
return removed;
}

bool TimberRegister::existTimber(string dimension, int meters, double price) {
bool found = false;
Timber tmp(dimension, meters, price);

for (int i = 0; i < nrOfTimber && found == false; i++) {
    if (*this->timber[i] == tmp) {
        found = true;
    }
}
return found;
}

int TimberRegister::getNrOfTimber() const {
return this->nrOfTimber;
}

string TimberRegister::getTitle() const{
return this->title;
}

void TimberRegister::setTitle(string title) {
this->title = title;
}

void TimberRegister::clear() {
freeMemory();
this->timber = new Timber*[capacity];
}

void TimberRegister::getTimberAsString(string arr[], int nrOf) const {
for (int i = 0; i < nrOf; i++) {
    arr[i] = this->timber[i]->toString();
}
}

Solution

  • But it will not work. I have been searching and searching but can not find the problem.

    One problem I noticed:

    void TimberRegister::initiate(int from) {
         for (int i = 0; i < this->capacity; i++) {
            this->timber[i] = nullptr;
         }
     }
    

    In that function, you are making all the pointers nullptr. You need to use:

    void TimberRegister::initiate(int from) {
         for (int i = from; i < this->capacity; i++) { // i = from, not i = 0
            this->timber[i] = nullptr;
         }
     }