Struktur mit Feld in einer Klasse dynamisch reservieren
-
Mein Projekt besteht aus folgenden Dateien:
unit1.cpp
unit1.h
adressen.cpp
adressen.hMeine Fragen stehen als Kommentar im Text.
adressen.h:
struct person { char pvorname[25]; char pzuname[25]; char pstrasse[25]; char port[25]; int plz; }; class TAdressen { private: int *anzahl; int wert; person daten[50];//Wie kann ich die 50 mit einer Variablen ersetzen? public: TAdressen(); TAdressen(int soviel); ~TAdressen(); void einlesen(void); int wieviel(int soviel); int nulloderwas(void); const person *Get_daten(); void Setplz(int Newplz); int Get_plz(); void Setpvorname(char *Newpvorname); void Setpzuname(char *Newpzuname); void Setpstrasse(char *Newpstrasse); void Setport(char *Newport); AnsiString Get_pvorname(); AnsiString Get_pzuname(); AnsiString Get_pstrasse(); AnsiString Get_port(); int Get_wieviel(); };adressen.cpp:
TAdressen::TAdressen() { anzahl = new int[25]; wert = 20; } //*************************************************************************** TAdressen::TAdressen(int soviel) { anzahl = new int[soviel]; wert = 0; daten[soviel].plz = 99999; strcpy(daten[soviel].pvorname, "Vorname"); strcpy(daten[soviel].pzuname, "Zuname"); strcpy(daten[soviel].port, "Ort"); strcpy(daten[soviel].pstrasse, "Straße"); } //*************************************************************************** TAdressen::~TAdressen() { delete anzahl; } //--------------------------------------------------------------------------- void TAdressen::einlesen(void) { if (wert == 0) { Application->MessageBoxA("Datensätze sind 0", "Pech"); return; } } //--------------------------------------------------------------------------- int TAdressen::wieviel(int soviel) { wert = soviel; return(wert); } //--------------------------------------------------------------------------- int TAdressen::nulloderwas(void) { return anzahl[wert]; } //--------------------------------------------------------------------------- void TAdressen::Setplz(int Newplz) { daten[wert].plz = Newplz; } //*************************************************************************** int TAdressen::Get_plz() { return(daten[wert].plz); } //--------------------------------------------------------------------------- void TAdressen::Setpvorname(char *Newpvorname) { strcpy(daten[wert].pvorname, Newpvorname); } //*************************************************************************** AnsiString TAdressen::Get_pvorname() { return(daten[wert].pvorname); } //--------------------------------------------------------------------------- void TAdressen::Setpzuname(char *Newpzuname) { strcpy(daten[wert].pzuname, Newpzuname); } //*************************************************************************** AnsiString TAdressen::Get_pzuname() { return(daten[wert].pzuname); } //--------------------------------------------------------------------------- void TAdressen::Setpstrasse(char *Newpstrasse) { strcpy(daten[wert].pstrasse, Newpstrasse); } //*************************************************************************** AnsiString TAdressen::Get_pstrasse() { return(daten[wert].pstrasse); } //--------------------------------------------------------------------------- void TAdressen::Setport(char *Newport) { strcpy(daten[wert].port, Newport); } //*************************************************************************** AnsiString TAdressen::Get_port() { return(daten[wert].port); } //--------------------------------------------------------------------------- int TAdressen::Get_wieviel() { return(wert); }unit1.cpp:
TAdressen *ObjektAdressen; TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { ObjektAdressen = new TAdressen(0); } //--------------------------------------------------------------------------- void __fastcall TForm1::ButtonDatSatzEinlesenClick(TObject *Sender) { int soundsoviel = 0, anzahl; if (EditDatSatzInput->Text.Length()) soundsoviel = StrToInt(EditDatSatzInput->Text); ObjektAdressen = new TAdressen(soundsoviel = StrToInt(EditDatSatzInput->Text)); anzahl = ObjektAdressen->wieviel(soundsoviel); EditDatSatzOutput->Text = ObjektAdressen->wieviel(anzahl); } //--------------------------------------------------------------------------- void __fastcall TForm1::ButtonDatenEinlesenClick(TObject *Sender) { ObjektAdressen->einlesen(); if (int count = StrToInt(ListBoxDaten->Items->Count) == ObjektAdressen->Get_wieviel() && ObjektAdressen->Get_wieviel() != 0) { Application->MessageBoxA("Voll","Schluss"); return; } char buf[150]; for (int i=0; i<ObjektAdressen->Get_wieviel(); i++) { if (EditPLZ->Text.Length()) ObjektAdressen->Setplz(StrToInt(EditPLZ->Text)); if (EditOrt->Text.Length()) ObjektAdressen->Setport(EditOrt->Text.c_str()); if (EditStrasse->Text.Length()) ObjektAdressen->Setpstrasse(EditStrasse->Text.c_str()); if (EditVorname->Text.Length()) ObjektAdressen->Setpvorname(EditVorname->Text.c_str()); if (EditZuname->Text.Length()) ObjektAdressen->Setpzuname(EditZuname->Text.c_str()); sprintf(buf,"%i %s %s %s %i %s",ObjektAdressen->Get_wieviel(), ObjektAdressen->Get_pvorname(), ObjektAdressen->Get_pzuname(), ObjektAdressen->Get_pstrasse(), ObjektAdressen->Get_plz(), ObjektAdressen->Get_port()); ListBoxDaten->Items->Add(buf); break; } } //--------------------------------------------------------------------------- void __fastcall TForm1::ButtonWelcherDatensatzClick(TObject *Sender) { //Wie kann ich einen bestimmten Datensatz (zum Beispiel den 12.) an die //ListBox ausgeben? Ich meine wie sage ich welches Feld ich will? } //---------------------------------------------------------------------------
-
zu 1.)
CPP: Siehe DynamicArray / std::vector.
C: Siehe calloc / malloc.zu 2.)
Entweder du definierst dir einen eigenen Operator für deine Klasse oder mittels Getter/Setter - Funktionen.