2016-03-20 10 views
-4

私はベクトル、地図などのSTDコンテナクラスを使用できないC++で宿題をしようとしています。私たちは、次のアーカイブがあるとします。本はXのカテゴリからのものであることを意味し、説明の目的のためにオブジェクトの配列のサイズを変更する

2 
El juego de Ender-Orson Scott-Tor Books-980.275.246-1985-6000 
890365.2 
2 
The following-Lily Tyler-Tor Books-980.275.246-1985-6000 
890365.2 

すると数2とさせて頂きます、この場合は2つの手段は、フィクションの本で、2の後に次の行がちょうど基本です(名前、著者、出版社、isbn、年、価格)とその次の行は、私たちがCCFと呼ぶものであり、フィクションカテゴリのこれらのタイプの書籍の別のコードです。

私はちょうど次の部分に立ち往生しています。私はコンテナクラスなしでオブジェクトの配列を作成する方法を知っていますが、この配列のサイズを変更する方法はわかりません。reallocについて聞いていますが、オブジェクト配列型でどのように使用するのか分かりません。 LibroはFiccionの親であり、後で同じ配列にもっと多くのクラスを導入する必要があるため、Ficcion型をLibroの多相配列に格納しようとしていますが、学習目的のためにはficcionクラスだけでサイズを変更しようとしていますそれは、次のコードが間違っていることを知っています。なぜなら私はmallocを使っていて、子オブジェクトを新しいものに割り当てて再割り当てするからです。しかし、私が言ったように、新しい子オブジェクトが3回毎に作成されることを示すコードを参照してください。ファイルがgetlineを実行しました。何かが不足していると思われる場合は教えてください。私はこの問題の主な問題をカバーしています。私はちょうどあなたがこれらのタイプの配列に対処する必要があるときに情報のいくつかのenlightmentを求めているとあなたはそれらのサイズを変更する必要がありますまた、これはコンテナクラスでもっと簡単になるだろうが、 。前もって感謝します!素晴らしい昼/夜を!

void BookManager::dataLoading(char* fileName){ 

//Arbitrary size to be resized later on (this is the array declared as **libro in the .h file) 
libros = (Libro**)malloc(1 * sizeof(Libro**)); 

//file-in variable 
std::ifstream inFile(fileName); 

char type[10]; 

//counter 
int i = 0; 

//First getline 
while (inFile.getline(type,sizeof(inFile)) && i < 2){ 

    //Book Info; Second Getline 
    char bookInfo[100]; 
    inFile.getline(bookInfo, sizeof(inFile)); 

    //Additional book information; Third getline 
    char additional[60]; 
    inFile.getline(additional, sizeof(inFile)); 

    //Child creation 

    if (type[0] == '2'){ 

     this->separateData(bookInfo); 
     //Ficcion constructor creating an object to store in the libros polymorphic array 
     libros[i] = new Ficcion(this->bookData[0], this->bookData[1], this->bookData[2], atof(this->bookData[3]), atoi(this->bookData[4]), atoi(this->bookData[5]), atof(additional)); 


    } 


    i++; 
    //Failed reallocating 
    libros = (Libro**)realloc(libros, i+1 * sizeof(Libro**)); 



} 
// This one is just testing if the array worked but i get an unhandled exception when i=1; 
for (int i = 0; i < 2; i++){ 
    std::cout << libros[i]->getTitulo() << '\n'; 
} 

inFile.close(); 

}

UPDATE溶液: iは、古いデータと新しいものを返し、それをリサイズし、古いものを削除する機能を作成下にダウン示唆したように、これは、ポインタの配列であるので保存するための空き容量が必要です。これまでのところ、これは動作しています、ありがとう、たくさんの人!等

Libro** BookManager::resize(Libro** arr,int size){ 

Libro** resized = new Libro*[size]; 

for (int i = 0; i < size-1; i++){ 
    resized[i] = arr[i]; 
} 

delete[]arr; 

return resized; 

}

+0

アレイのサイズを変更することはできません。あなたができることは、新しい配列を作成し、そのデータをコピーし、古いものを削除することだけです。 – immibis

+0

C++では、 'malloc'ではなく' new'と 'delete'を使用してください。できれば 'unique_ptr'と' make_unique'を使います。 – Thomas

+0

よろしく!これは私の考えを確認する、ありがとう!私はちょうど – NeptaliD

答えて

2

のmalloc、reallocの、.. Cライブラリ関数です。あなたの質問にはC++タグが含まれていますが、Cではありません。 C++で

、オブジェクトはnewが割り当てられ、そしてdeleteと割り当て解除されます。これには配列も含まれます。

既存の配列のサイズを変更するには、newを使用して新しい配列を割り当て、新しいサイズで既存の配列の要素をコピーしてから、deleteで古い配列の割り当てを解除します。

(これは技術的には100%ではありませんが、これは割り当ての一部として実行される可能性が高い)。

+2

"...古い配列を' delete'で割り当て解除します - 実際は 'delete []' – WhozCraig

+1

Cの標準ライブラリのほとんどはC++の一部です。'malloc'はC++のいくつかのものに使用できます。 –