2017-02-02 16 views
0

オブジェクトを追加するときに配列を展開しようとしています。しかし、それは動作しません。私は検索して検索していますが、問題を見つけることができません...それは訓練された目のための難しい仕事とは思わないので、私はあなたに頼むことができると思った。私はクラスTimberTimberRegisterにリンクされていますが、TimberにはTimberRegisterが見えませんが、TimberRegisterには2つのクラスがあります。私はそれがTimberRegisterとメインファイルのcppfileを表示するのに十分であるはずだと思います。なぜなら、他のファイルはokeyであり、エラーには影響しないはずですから、toStringは第3のオブジェクトを書くことができません。それのための記憶がない。動的に割り当てられたポインタ配列のメモリを拡張する

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

なぜ 'std :: vector'を使用していませんか? – Barmar

+2

'std :: vector <>'はあなたが望むものを正確に行います。 **これを使って**! –

+0

ありがとう:)しかし、私はそれを使用することはできません。私は今、ベクトルなしでこれを行うことを学ぶ必要があります。 – Henke

答えて

3

しかし、それは動作しません。私は検索して検索していますが、問題を見つけることはできません。私が気づい

一つの問題:その関数で

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

はい、ありがとうございます!それが問題でした。今はうまくいっています:) – Henke

2

まず、コメントが指摘するように:

std::vector 

よりよい解決策かもしれません。

第2に、コードを一様にインデントして読みやすくすることをお勧めします。

最後に、(そして、あなたのテーブルは常にnullポインタが、何も終わるしている場合)私は、これが問題だと思う:

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

べきではないfromからi開始?すなわちint i = from

+0

ありがとうございました:)それは本当に問題でした。 – Henke

関連する問題