Membervariablen von einer Klasse in eine andere durchreichen



  • @ 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. 🙄



  • Stell mal deinen Source Online und ich werde ihn mir ansehen.



  • Hallo Unix-Tom,

    [url]http://sisco.kicks-ass.net/~scipy/Modulverwaltung.exe [/url]
    sind aber noch Sachen drin, die ni ganz sauber programmiert sind, wo ich aber wegen Zeitmangel momentan noch nix anderes programmiert hab. Naja egal schau´s dir mal an... 🙂



  • Kann es sein das der Link nicht funzt ?

    Zumindest von TDSL nicht

    Allerdings komme ich auf www.pcwelt.de auch nicht. Sonst geht alles.
    Check mal deinen Server



  • @Unix-Tom

    Hallo Thomas,
    Äh, ja der Server is grad down(gestern ging´er noch), versuch´s mal unter "highendzone.host.sk/Modulverwaltung.exe" das sollte funzen! Und danke, dass du die die Zeit nimmst.



  • ändere mal

    m_benutzernamen.GetCurSel()
    auf

    pm_benutzer->m_benutzernamen.GetCurSel()

    wenn du schon auf eine andere Klasse zugreifst dann mit beiden

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



  • @ Unix-Tom

    Jetzt funzt´s! 😃 Is ja eigentlich logisch, aber manchmal ist man bei der Problemlösung ganzschön vernagelt. 🙄
    Also goßes Dankeschön nochmal.


Anmelden zum Antworten