私はベクトル、地図などの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;
}
アレイのサイズを変更することはできません。あなたができることは、新しい配列を作成し、そのデータをコピーし、古いものを削除することだけです。 – immibis
C++では、 'malloc'ではなく' new'と 'delete'を使用してください。できれば 'unique_ptr'と' make_unique'を使います。 – Thomas
よろしく!これは私の考えを確認する、ありがとう!私はちょうど – NeptaliD