Membervariablen von einer Klasse in eine andere durchreichen



  • Ja danke Volle,
    aber in den FAQ´s von MFC hab ich nichts passendes gefunden, erst in FAQ C++, aber damit kann ich nix so richtig anfangen. Will ni sagen, dass ich Anfänger bin, aber von MFC hab ich ni so den Plan. Also ein kleines Beispiel wäre vielleicht ni schlecht.
    Wie sollte so ein Zeiger aussehen?



  • Original erstellt von *Neo81(looks for the white rabbit)*:
    **Ja danke Volle,
    aber in den FAQ´s von MFC hab ich nichts passendes gefunden, erst in FAQ C++, aber damit kann ich nix so richtig anfangen. Will ni sagen, dass ich Anfänger bin, aber von MFC hab ich ni so den Plan. Also ein kleines Beispiel wäre vielleicht ni schlecht.
    Wie sollte so ein Zeiger aussehen?
    **
    Äh danke devil81.
    Lesen ist das eine! Aber das Gelesene verstehen ist das andere! Bin vielleicht bissl begriffsstutzig. 😃



  • [ Dieser Beitrag wurde am 14.11.2002 um 13:12 Uhr von devil81 editiert. ]



  • Hi neo,

    also ich würde das schon auch so ähnlich machen, wie devil das schon beschrieben hat.

    Du machst dir in deiner 2. Klasse eine Funktion. Der übergibst du einen Pointer auf deine 1. Klasse. Z.B.:

    SetDlgPointer(CDeineErsteKlasse* pErsteKlasse);
    

    Dann brauchst du natürlich noch eine Variable in deiner 2. Klasse. Etwa so:

    CDeineErsteKlasse* pErsteKlasse;
    

    Diese Funktion rufst du jetzt dort auf, wo du deinen 2. Dialog mit DoModal startest. Etwa so:

    instanzZweiteKlasse.SetDlgPointer(&InstanzErsteKlasse);
    instanzZweiteKlasse.DoModal();
    

    Jetzt kannst du mit

    pErsteKlasse->schoenerString;
    

    oder mit

    pErsteKlasse->auchAufAndereSachen;
    

    auf deine 1. Klasse zugreifen.

    Alles klar?

    Gruß, Volle.



  • @Volle
    für einen CString ist das ein riesen Aufwand...
    Dann lieber eine Set und eine Getfunktion...

    Devil



  • Hi zusammen,

    wenn du meinst;)...

    Hier ist noch eine Lösung von Unix- Tom die eigentlich die beste/ sauberste ist.

    Gruß, Volle.

    [ Dieser Beitrag wurde am 14.11.2002 um 14:34 Uhr von Volle editiert. ]



  • Ok, danke.
    Alle Klarheiten beseitigt. Ich versuch das mal zu implementieren.
    Danke euch nochmal für eure Hilfe.(melde mich bestimmt noch mal)



  • @ Volle

    Hi,
    wollte noch wissen, wie sich das bei Property-Klassen verhält, wo wird die Instanz der Property-Pages gebildet? Weil ich instanziere ja im Prinzip nur die von 'CPropertySheet' abgeleitete Klasse. Diese wiederum bedient sich ja der Membervariablen der PropertyPages. Also was ist die Instanz der "Dialoge" auf dem PropertySheet?



  • Hallo Neo,

    die Variablen in deiner Sheet- Klasse sind generell mal Instanzen.

    Ich weiß jetzt nicht, ob ich das pädagogisch wertvoll rüberbringen kann... Wenn du eine Instanz einer Klasse erzeugst, dann belegst du dafür Speicher im RAM (mal ganz grob).

    Also so

    CMyClass myClass;
    

    oder so

    CMyClass* myClass;
    myClass = new CMyClass;
    

    Das ist nichts anderes, wie für 'normale' Variablen auch.

    Z.B.:

    int myInt;
    

    oder andere Dinge.

    Also in deinem konkreten Fall hast du jeweils eine Klasse für dein Sheet und deine Pages.

    Irgendwo hast du stehen:

    CMyProberty myProberty;
    

    oder etwas Analoges. Du hast also eine Instanz von dieser Klasse erzeugt, mit der du arbeiten kannst. Im Header deiner Sheet- Klasse hast du dann die Membervars für die einzelnen Pages.

    CMyPage1 myPage1;
    CMyPage2 myPage2;
    

    Also wieder Instanzen, mit denen du arbeiten kannst.

    Ich hoffe, ich konnte es dir ein bisschen erklären. Falls nicht, dann schau dir mal ein Tut an, wo das an einem Beispiel durchgearbeitet wird. Hier im Forum gibt es ja auch ein paar Links auf gute Sachen.

    Grüße, Volle.



  • @Volle

    Hallo Volle,

    danke für deine Bemühungen, mir das Thema begreiflich zu machen.Hab verstanden, was du meinst. Das funktioniert auch, bis auf einen Fehler:

    passwort_aendern.SetDlgPointer(&m_benutzer);
    

    "m_benutzer" ist meine Instanz von der PropertyPage, also meine "InstanzErsteKlasse".Aber er kann sie nicht finden. Da fehlt wohl noch irgendwas, oder?



  • Hallo Neo,

    das ist ein wenig schwierige so aus der Ferne...

    Hast du die Header richtig eingebunden? Was genau meinst du mit "nicht finden können" (Fehlermeldung?)?

    Grüße, Volle.



  • @ Volle

    Hi Volle,
    "Nicht deklarierter Bezeichner 'm_benutzer'" is die Meldung.Alles andere geht ja anscheinend. Und ich hab auch die Header eingebunden. Und damit dass es eine private Variable ist, kann das ni zusammenhängen, oder?



  • Hallo Neo,

    "Nicht deklarierter Bezeichner" hat eigentlich nichts mit privat oder nicht zu tun. Aber das könnte dir anderen Ärger verursachen.

    Die Fehlermeldung klingt schon am ehesten nach einem Headerproblem oder einem simplen Schreibfehler. Schau dir das alles nochmal genau an. Sowas übersieht man gerne. Z.B. m_Benutzer oder m_benutzer usw.

    Ansonsten erzähl mal noch ein bisschen was über den Kontext.

    Was ist "passwort_ändern" und wo gehört es hin?
    Wo sind "m_benutzer" und "passwort_ändern" deklariert?

    Einfach mal beschreiben, wie was zusammenhängt...

    Gruß, Volle.



  • Hi Volle,

    Also: Ich habe ein Dialog mit den Registerkarten "CPropertyDialog", da sind die Variablen für die PropertyPages deklariert: 'm_benutzer' und 'm_protokollverw'.So und auf der einen Page is die Benutzerverwaltung und auf der anderen die Protokollverwaltung, welche jetzt aber erstmal keine Rolle spielt. Auf der Benutzer-Page gibt es eine ComboBox, wo ein Name eines Benutzers ausgewählt werden kann. Wird dies getan, erscheint in der darunterliegenden EditBox das dazugehörige Passwort. Und das kann man ändern, indem man auf einen 'Ändern...'-Button klickt.Hier is die Funktion dazu:

    void CBenutzer::OnBUTTONPasswAendern() 
    {
        Passwort_Aendern passwort_aendern;
        passwort_aendern.SetDlgPointer(&m_benutzer);
        passwort_aendern.DoModal();
    }
    

    'Passwort_Aendern' is die "2.Klasse" in der ich auf die Membervariablen von der Page CBenutzer ("1.Klasse") zugreifen will, also in der ich den Pointer auf die "1.Klasse" benötige.
    Da aber CBenutzer in CPropertyDialog instanziert wird, muss ich ja auf diese "Page-Variable" m_benutzer zugreifen und diese in der Funktion SetDlgPointer()übergeben, oder?
    So, das is im Groben der Kontext. Das Projekt ansich is zu komplex, um das mal schnell zu beschreiben, es sei denn, du hast viel Zeit.
    Gruß und Dank,
    Neo



  • Hi Neo,

    das sollte reichen...

    Wenn ich es kapiert habe, dann sollte es heißen:

    passwort_aendern.SetDlgPointer(this);
    

    Grüße, Volle.



  • Naja,
    das funzt ni so richtig, weil:
    error C2664: 'SetDlgPointer' : Konvertierung des Parameters 1 von 'class CBenutzer *const ' in 'class CPropertyDialog *' nicht moeglich

    Was nu? 😕



  • Hi Neo,

    aber hallo bzw. "but hello", wie der Engläner sagen würde😕...

    Aber du willst doch an SetDlgPointer die aktuelle Instanz von deinem CBenutzer- Objekt übergeben.

    Wie hast du denn SetDlgPointer in Password_aendern deklariert? Richtig wäre dann

    SetDlgPointer(CBenutzer* pBenutzer);
    

    Und du musst "benutzer.h" in deiner Password_aendern- Klasse einbinden(<- warum fehlt da eigentlich das "C"?). Dann sollte das auch laufen oder ich habe das völlig falsch verstanden, was du vor hast.

    Ich habe mal eine Art Beispiel gemacht. Password_aendern heißt bei mir CSetPwd.

    //im Header- File von CSetPwd
    class CBenutzer;
    
    class CSetPwd
    {
        ...
    private:
        CBenutzer* m_Benutzer;
    public:
        void SetDlgPointer(CBenutzer* aBenutzer);
        ...
    }
    
    //im CPP- File von CSetPwd
    #include "Benutzer.h"
    
    void CSetPwd::SetDlgPointer(CBenutzer* aBenutzer)
    {
        m_Benutzer = aBenutzer;
    }
    
    /*und der Aufruf dann so wie du ihn hast 
      im CPP- File von CBenutzer*/
    ...
    CSetPwd setPwd;
    setPwd.SetDlgPointer(this);
    setPwd.DoModal();
    ...
    

    Grüße, Volle.



  • Warum machst du es nicht einfach so wie ich es beschrieben habe ?

    Volle:

    Was du ihm die ganze Zeit erklärst ist nichts anderes als meine Beschreibung.
    ( Übergebe this-Zeiger an Klasse die damit arbeiten kann.)



  • @Unix- Tom:

    Ja klar. Aber irgendwie bekommt es Neo nicht hin 😕 ...

    Vielleicht kannst du es ihm ja beibiegen?

    Gruß, Volle.



  • Hallo Leute,

    Ich danke euch erstmal, dass ihr euch solche Mühe gebt, mir das Thema verstäntlich zu machen. Ich verstehe auch um was es geht(halbwegs zumindest).Ich hatte das schon mal theoretisch im Rahmen meiner Ausbildung. Aber leider nicht an solchen Beispielen.Deshalb bin ich euch sehr dankbar, dass ihr hier mit so einer Engelsgeduld rangeht und erstmal keinen für sein Unwissen verurteilt(da wäre ja auch das Forum sinnlos).Das Problem ist nämlich, dass es sich bei meinem Programm um eine Projektarbeit handelt, die im Rahmen eines Praktikums angefertigt werden muss(welche dann natürlich Prüfungsvorausetzung ist). Und um das einigermaßen sauber über die Bühne zu bringen, bin ich gezwungen auf solche Sachen wie "globale Variablen" und all das Zeug, was man als guter C++Programmierer nicht verwendet, zu verzichten.Da die Stoffdichte in der Ausbildung sehr hoch ist, sind die Dozenten gezwungen, an der Zeit zum Üben zu sparen.Verständlich! Aber dann bleiben solche, ich sag mal "kniffligen" Sachen, wie klassenübergreifende Variablenverwendung, irgendwo auf der Strecke.
    Und wie soll man es anders Lernen, als es sich irgendwo abzugucken(das machen selbst die Primaten so), denn nur so wrid das Ganze effektiv. Genauso problematisch is die Tatsache, dass das Thema MFC erst nach dem Praktikum behandelt wird, ich es aber jetzt brauche, da der Praktikumsbetrieb das als mehr od. weniger effektiv erachtet. Nur das sich keiner damit auskennt. Nicht einmal die Dotzenten können einem weiterhelfen. Fazit: Ich besorgte mir das einzig gute Buch, was es in dieser Richtung gibt und hab mich reingearbeitet, mit relativ guten Fortschritten weitergemacht und nu is zick. Jetzt kam nur noch ein Board in Frage.

    Also deshalb hier noch eine Frage:
    Wieso kennt er meine Membervar immer noch nicht. Ich hab´s wirklich haargenau so gemacht, wie oben beschrieben, hab noch mal die Headerdateien überprüft, die Namen, die Deklarationen, und trotzdem is diese besch...ene Membervar 'm_benutzernamen' ein "nicht deklarierter Bezeichner". Wenn ich den Pointer auf die Klasse gesetzt hab, wo sich diese Membervar befindet, dann kann ich doch so darauf zugreifen, oder?

    pm_benutzer->m_benutzernamen.GetLBText(m_benutzernamen.GetCurSel(),bName);
    

    'pm_benutzer' is der Zeiger auf die "fremde" Klasse.
    Und wenn ich das so compiliere gehts:

    pm_benutzer->m_benutzernamen;
    

    Aber wahscheinlich nur, weil er da noch ni richtig auf m_benutzernamen zugreift, oder?
    Ich verier bald die Nerven bei dem Prog!Das raubt mir ja schon den Schlaf. Wenn das die Bestimmung eines Programmierers ist, dann muss ich mir das alles noch einmal anders überlegen. 🙄


Anmelden zum Antworten