Verständnisfragen zu vector in OOP Anwendung



  • Hallo Community

    Ich habe da mal ein paar Verständnisfragen, weil ich das weder in den Handbüchern von Borland noch von Richard Kaiser finde. Auch in diesem Forum finde ich es nirgends und kann das nicht richtig rauslesen.

    In C wird die GUI von der Datenseite getrennt.
    D.h. ich erstelle mir eine Unit2 in der ich z.B. eine Struktur TBenutzer Global anlege.
    In der Unit1 lege ich einen Platzhalter an z.B. Benutzer Neu; und greife über Funktionen die mir z.B. einen Rückgabewert der Struktur liefern auf diese Struktur zu.

    Wenn ich das Projekt aber nun in OOP realisieren möchte, hat mir ein Kollege gesagt, dass die Daten nicht mehr in verschiedenen Units global abgelegt werden.

    Dann werden alle Daten von Unit1 verwaltet und diese schiebt dann z.B. eine Referenz an ein anderes Formular wenn dieses die Daten benötigt.

    Frage 1: Also verstehe ich das richtig, daß ich alle Datenarrays oder besser gesagt die vectoren die ich benötige in der Unit1 anlegen sollte. Und die Visu Komponenten und die Daten nicht mehr getrennt werden?

    Da die Daten während der gesamten Laufzeit des Programms verfügbar sein sollten habe ich in der Unit1.h im private Bereich einen vector erstellt:

    vector <TBenutzer> Benutzerliste;
    

    Frage2: Sollte der vector besser im public Bereich angelegt werden?

    Wenn ich nun einen Button SBBenutzerverwaltung anklicke erstelle ich dynamisch zur Laufzeit eine Unit2 die ich MODAL anzeige.

    Frage3: Wie Übergebe ich aber eine Referenz eines vectors an eine Unit2 in der ich die Benutzer verwalten möchte?

    void __fastcall TFormGrundbild::SBBenutzerverwaltungClick(TObject *Sender)
    {
     // Benutzerverwaltung Formular erstellen
     BenutzerverwaltungForm = new TFormBenutzerverwaltung(this);
    
     // Formular modal anzeigen
     BenutzerverwaltungForm->ShowModal();
    
     delete BenutzerverwaltungForm;
     BenutzerverwaltungForm = NULL;
    

    Eigentlich müßte ich ja sowas machen

    BenutzerverwaltungForm = new TFormBenutzerverwaltung(&Benutzerliste,this);
    

    Frage4: So was geht aber nicht, also wie realisiere ich das dann, wenn der vector in Unit2 nicht bekannt ist?



  • egcactus schrieb:

    BenutzerverwaltungForm = new TFormBenutzerverwaltung(&Benutzerliste,this);
    

    sowas geht schon, du mußt nur den Konstruktor des TFormBenutzerverwaltung entsprechend anpassen, in der CPP und im Header, und dann im Konstruktor den Wert/Zeiger einfach an eine Form-interne Variable übergeben



  • Hallo

    Frage 1: Also verstehe ich das richtig, daß ich alle Datenarrays oder besser gesagt die vectoren die ich benötige in der Unit1 anlegen sollte. Und die Visu Komponenten und die Daten nicht mehr getrennt werden?

    Selbstverständlich sollte man GUI und Logik voneinander trennen. Das heißt du erstellst eine/mehrere Klassen die die Daten verwalten, unabhängig davon ob und wie sie angezeigt werden.
    Die Instanzen dieser Verwaltungsklassen könnnen nun aber sehr wohl von den Form-Klassen erzeugt und nach Gebrauch wieder gelöscht werden. Hier sollte man globale Instanzen vermeiden, es sei denn man braucht wirklich ein Singleton.

    Frage2: Sollte der vector besser im public Bereich angelegt werden?

    Da kannst du dir eine einfache Frage stellen : Macht es dem Form etwas aus, wenn das Array oder seine Elemente von außen geändert werden ohne das das Form darauf reagieren kann? Könnten da Diskrepanzen zwischen Daten und Anzeige entstehen? Wenn du diese Fragen nicht 100% mit nein beantworten kannst solltest du den Vector private machen. Siehe das Prinzip Datenkapselung.

    bis bald
    akari



  • Also erstelle ich mir wie gehabt meine Klasse TBenutzer in einer separaten Unit. Binde sie in die DatenUnit ein und erstelle dort einen privaten vector, der mir meine Benutzerelemente verwaltet.

    Danach binde ich die Datenklasse und die Benutzerklasse im Mainformular ein.

    Aber wie ich eine Referenz auf den vector übergebe habe ich immer noch nicht richtig begriffen.

    Wenn ich sowas versuche bemängelt Borland das er das nicht möchte.

    TFormBenutzerverwaltung(vector <TBenutzer> *Liste,TComponent* Owner);
    

    bei

    TFormBenutzerverwaltung(vector *Liste,TComponent* Owner);
    

    erkennt er den Datentyp nicht. Ok, ich gebe ja auch nicht an, was für einen <TBenutzer>, aber wie mache ich es dann richtig?



  • Hallo

    Zunächst einmal übergibst du einen Pointer auf vector, keine Referenz. Und vermutlich hast du nur vergessen den Include für Benutzer in den Form-header mit zu übernehmen. Mehr läßt sich ohne konkreten Code und Fehlemeldung nicht sagen.

    bis bald
    akari



  • In meiner MainForm rufe ich die Benutzerverwaltung auf:

    BenutzerverwaltungForm = new TFormBenutzerverwaltung(&Benutzerliste,this);
    

    In der Headerdatei meiner Benutzerverwaltung.h erwarte ich

    __fastcall TFormBenutzerverwaltung(vector <TBenutzer>*Liste,TComponent* Owner);
    

    und in der Benutzerverwaltung.cpp Datei steht:

    __fastcall TFormBenutzerverwaltung::TFormBenutzerverwaltung(vector <TBenutzer>
                    *Liste, TComponent* Owner) : TForm(Owner)
    

    Der Fehler den ich bekomme ist:
    das der Compiler hinter der geöffneten spitzen Klammer in der Benutzerverwaltung.h und der Benutzerverwaltung.cpp an der Stelle stehen bleibt

    __fastcall TFormBenutzerverwaltung(vector < <--- bleibt hier stehen.

    und als Fehler meldet:

    [C++ Fehler] Benutzerverwaltung.h(107): E2293 ) erwartet

    die Headerdateien von TBenutzer habe ich sowohl in der Main.h als auch in der Benutzerverwaltung.h eingebunden.



  • Hallo

    Und was ist mit dem Header für vector? Nicht zu vergessen der Namespace vom vector.

    bis bald
    akari



  • hey, super genau das wars. Habe den Header vom vector nur in der Main.h eingebunden und nicht in meiner Benutzerverwaltung.

    Manchmal sieht man den Wald vor lauter Bäumen nicht.

    Das hilft mir echt weiter.
    Danke.


Log in to reply