x Objekte erstellen - Wie??
-
Ich arbeite grade mit einem Freund an einem Programm.
Wir sind auf das Problem gestossen dass wir in einer Textdatei Informationen über mehrere Autos haben. Jede Zeile steht für ein Auto.
Wir haben die Anzahl der Zeilen und somit die Anzahl der Autos ermittelt.Jetzt müssen wir aber so viele Objekte erstellen, wie die Anzahl der Autos ist.
Ziel ist es dass wir die ganzen Objekte irgendwie in einer verkretteten Liste abspeichern und von dort aus ein Auto löschen/editieren können.Das Problem ist die speicherplatzreservierung für die Objekte und das einlesen der Objekte in die Verkettete Liste.

Wie sollen wir das lösen?
Hier mal unsere Basisclasse für die Autos (falls es Hilft):
class ClassCar { private: short int Status; float CostPerWeekDay; float CostPerWeekFinalDay; float FlatMileageRate; float BasicChargePerDay; char CarName[50]; char CarBrand[50]; public: //Pointer use of List ClassCar *ptn; // Get.Set->Status float GetStatus() { return(Status); } void SetStatus(float fkt_Status) { Status = fkt_Status; } // Get.Set->CostPerWeekDay float GetCostPerWeekDay() { return(CostPerWeekDay); } void SetCostPerWeekDay(float fkt_CostPerWeekDay) { CostPerWeekDay = fkt_CostPerWeekDay; } // Get.Set->CostPerWeekFinalDay float GetCostPerWeekFinalDay() { return(CostPerWeekFinalDay); } void SetCostPerWeekFinalDay(float fkt_CostPerWeekFinalDay) { CostPerWeekFinalDay = fkt_CostPerWeekFinalDay; } // Get.Set->FlatMileageRate float GetFlatMileageRate() { return(FlatMileageRate); } void SetFlatMileageRate(float fkt_FlatMileageRate) { FlatMileageRate = fkt_FlatMileageRate; } // Get.Set->BasicChargePerDay float GetBasicChargePerDay() { return(BasicChargePerDay); } void SetBasicChargePerDay(float fkt_BasicChargePerDay) { BasicChargePerDay = fkt_BasicChargePerDay; } // Get.Set->CarName void SetCarName(void) { printf("Type in the cars name: "); gets(this->CarName); } char * GetCarName(char *n) { strcpy(n,CarName); return(CarName); } // Get.Set->CarBrand char * GetCarBrand(char *n) { strcpy(n,CarBrand); return(CarBrand); } // Write All Data on HDD void WriteToDisk() { FILE * FilePointer; short int exists = 0; if((FilePointer = fopen("test.txt","r")) == NULL) { exists++; } FilePointer = fopen("test.txt","a+"); //cout << this->Status; if (exists == 0) { fprintf(FilePointer, "\n"); } fprintf(FilePointer, "%d,", Status); fprintf(FilePointer, "%s,", CarName); fprintf(FilePointer, "%s,", CarBrand); fprintf(FilePointer, "%.2f,", CostPerWeekDay); fprintf(FilePointer, "%.2f,", CostPerWeekFinalDay); fprintf(FilePointer, "%.2f,", FlatMileageRate); fprintf(FilePointer, "%.2f", BasicChargePerDay); fclose(FilePointer); } void InputCarsDetails(void) { cout << "Type in the Cars Brand: "; gets(this->CarBrand); cout << "Type in the Cars Name: "; cin >> this->CarName; cout << "Whats the Cost Per Weekday: "; cin >> this->CostPerWeekDay; cout << "Whats the Cost Per Week Finalday: "; cin >> this->CostPerWeekFinalDay; cout << "Whats the Basic Charge Per Day: "; cin >> this->BasicChargePerDay; cout << "Whats the Flat Mileage Rate: "; cin >> this->FlatMileageRate; cout << "Whats the " << this->CarBrand << " " << this->CarName << " Status: "; cin >> this->Status; } };
-
Original erstellt von <Peter Piksa>:
Ziel ist es dass wir die ganzen Objekte irgendwie in einer verkretteten Liste abspeichern und von dort aus ein Auto löschen/editieren können.Wieso dann keine 'std::list<Auto> autos' erstellen und dann da die Datei einlesen. Oder eben alles von Hand machen, was auch nicht wirklich viel mehr Tipperei ist.
[Vor jede Klasse 'Class' zu schreiben ist ziemlicher Unfug, weil 'class' steht ja genau ein Wort davor :).]
-
wenn ihr die anzahl der einträge bereits habt, dann könnt ihr speicher für die objekte so anlegen:
ptn=new ClassCar[n];das erzeugt einen zeiger auf ein c-array aus n elementen vom typ ClassCar. den speicher könnt ihr bei bedarf mit
delete[] ptn;wieder freigeben.
besser wäre hier aber wirklich ein stl-vector (falls das für die schule sein sollte und ihr vectoren bereits durchgenommen habt ;))
PS: euer code für WriteToDisk() ist ein bißchen haarig. besser wäre es so:
void WriteToDisk() if(FILE *FilePointer = fopen("test.txt","a")) // warum wollt ihr denn nicht, daß die datei neu erzeugt wird, // falls sie noch nicht existiert??? { fprintf(FilePointer, "%d,", Status); fprintf(FilePointer, "%s,", CarName); fprintf(FilePointer, "%s,", CarBrand); fprintf(FilePointer, "%.2f,", CostPerWeekDay); fprintf(FilePointer, "%.2f,", CostPerWeekFinalDay); fprintf(FilePointer, "%.2f,", FlatMileageRate); fprintf(FilePointer, "%.2f", BasicChargePerDay); // das zeilenende wird natürlich ans zeilenende gesetzt ;) fprintf(FilePointer, "\n"); fclose(FilePointer); } }
-
Konfusius schrieb:
PS: euer code für WriteToDisk() ist ein bißchen haarig. besser wäre es so:
void WriteToDisk() if(FILE *FilePointer = fopen("test.txt","a")) // warum wollt ihr denn nicht, daß die datei neu erzeugt wird, // falls sie noch nicht existiert??? { fprintf(FilePointer, "%d,", Status); fprintf(FilePointer, "%s,", CarName); fprintf(FilePointer, "%s,", CarBrand); fprintf(FilePointer, "%.2f,", CostPerWeekDay); fprintf(FilePointer, "%.2f,", CostPerWeekFinalDay); fprintf(FilePointer, "%.2f,", FlatMileageRate); fprintf(FilePointer, "%.2f", BasicChargePerDay); // das zeilenende wird natürlich ans zeilenende gesetzt ;) fprintf(FilePointer, "\n"); fclose(FilePointer); } }Und den könnte man sogar noch zu einer einzelnen Anweisung zusammenbauen:
fprintf(FilePointer,"%d,%s,%s,%.2f,%.2f,%.2f,%.2f\n", Status, CarName, CostPerWeekDay, CostPerWeekFinalDay, FlatMileageRate, BasicChargePerDay);Oder du verwendest gleich fstreams für die Ausgabe:
ofstream ofile("test.txt",ios::append/*??*/) if(ofile) ofile<<Status<<","<<CarName<< ... << endl;
-
Leute...der Thread ist uralt.