Расширение памяти в динамически распределенном массиве указателей

Я пытаюсь расширить мой массив при добавлении объекта. Но это не сработает. Я искал и искал, но не могу найти проблему … Не думаю, что это будет трудная задача для обученного глаза, поэтому я подумал, что могу спросить вас, ребята. У меня есть два класса, где класс Timber связан с TimberRegister, но Timber Не могу видеть TimberRegister в то время как TimberRegister могу видеть это. Я думаю, этого должно быть достаточно, чтобы показать вам cppfile TimberRegister и основной файл, потому что я вполне уверен, что другие файлы являются окей и не должны влиять на ошибку, которая, как представляется, toString не могу написать третий объект, потому что нет памяти для него.

#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();
}
}

0

Решение

Но это не сработает. Я искал и искал, но не могу найти проблему.

Я заметил одну проблему:

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

В этой функции вы делаете все указатели nullptr, Вам необходимо использовать:

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

Другие решения

Прежде всего, как отмечают комментарии:

std::vector

может быть лучшим решением.

Во-вторых, я предлагаю сделать одинаковый отступ для вашего кода, чтобы его было легче читать.

Наконец, (и если ваши таблицы всегда заканчиваются только нулевыми указателями), я думаю, что это проблема:

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

не должны i начать с from? то есть int i = from

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector