Auf lokale Variable einer anderen Klassen Instanz zugreifen



  • Hallole.

    Also folgendes:

    Ich habe eine Funktion.
    In diese Funktion erzeuge ich eine Instanz einer Klasse.
    Innerhalb der Memberfunktion dieser Klasse erzeuge ich eine weitere Instanz eine anderen Klasse.In einer Memberfunktion diese wiederum ermittle ich aus einem String einen bestimmten Wert.
    Diesen sollte ich nun in der Ausgangsfunktion haben.
    Es ist eine Multithreaded umgebung und es sollte sichergestellt sein, daß der Wert eindeutig ist und kein andere drin rumfummelt.

    Beispiel:

    Ausgangsfunktion:
    
    FKT_ausgang()
    {
    //Instanz erzeugen
    CParseengine cp;
    
    cp.M_parser(...);
    
    //Hier sollte ich dann die ermittelte Variable haben:
    
    std::string ergebnis = eindeutige_ID;
    
    }
    
    //M_Parser
    BOOL CParseengine::M_Parser(void)
    {
    ....
    
    Instanz einer anderen Klasse erzeugen
    CHttp ht;
    
    //Hier wird die Variable ermittelt aus einem Eingangsstring
    ht.M_login();
    
    }
    
    ---
    
    //Login
    BOOL Chttp::M_login(void)
    {
    ....
    //Viel arbeit.
    //IN CHttp gibts einen Membervariable welche in 
    //dieser Funktion zugewiesen wird
    
    std::string eindeutige_ID;
    ....
    
    eindeutige_ID = "93jklkmckmpülk098";
    }
    

    Ich hoffe ich konnte das Problemchen etwas beleuchten.
    Eine globale Variable kommt keinesfalls in Frage.

    Mit ist noch eingefallen, ich könnte eine neue Klasse schreiben die von den ersten beider abgeleitet ist, dann hätte ich alle Variablen , oder?

    Wie könnte man so etwas machen?

    Danke für jeden Tip, Mondmann



  • Versuch's mal mit Rückgabewerten 😉

    string Chttp::Login()
    {
      string ID;
      ...
      return ID;
    }
    
    string CParseengine::Parse(...)
    {
      Chttp ht;
      return ht.Login();
    }
    
    void FKT_Ausgang()
    {
      CParseengine cp;
      string ergebnis = cp.Parse(...);
      ...
    }
    

    (Alternativ kannst du auch eine Referenz auf den String herumreichen, wo die einzelnen Funktionen ihre Daten eintragen "dürfen")



  • Wenn du einen Wert aus einer (wie tief auch immer geschachtelten) Funktion nach aussen weitergeben willst, gibts zwei Moeglichkeiten:

    1. Ueber den Rueckgabewert der Funktion
    2. Du uebergibst der Funktion eine Referenz auf ein aussen liegendes Objekt desselben Typs, so dass du in der Funktion diesem Objekt den Wert zuweisen kannst.

    Bsp:

    class MyClass;
    MyClass myvalue;
    
    //Version a)
    MyClass foo() { return bla; }
    
    myvalue = foo();  //myvalue hat jetzt den Wert von bla in der Funktion
    
    //version b)
    void bar(MyClass& mc) { mc = blubb; }
    bar(myvalue); //myvalue hat jetzt den  Wert von blubb in der Funktion
    

    Anmerkungen zu deinem Code:
    - nutze die [cpp]-Tags an Stelle der code-tags, das macht es fuer andere uebersichtlicher
    - ruecke deinen Code ordentlich ein, das machts auch fuer dich uebersichtlicher
    - deine funktion FKT_ausgang() hat keinen Rueckgabewert, ich vermute mal dass dein Compiler dir das ankreidet mit irgendwelchen Bemerkungen zum Thema "implicit return type int" oder aehnlichem.



  • Hi,
    das Problem ist also, dass es mehrere Threads gibt, welche Zugriff auf die lokale Variable benötigen? Sonst kannst du sie ja einfach zurueckgeben...
    In dem Fall mach doch eine Singleton-Instanz zur Verwaltung der IDs. Der Moeglichkeiten gibts viele.

    Gruss,
    DeSoVoDaMu



  • Danke für die schnellen Antworten.

    Über Rückgabewerte wollte ich es eigentlich nicht machen, da ich irgendwann mal nimmer durchblick wer was wann zurückgibt.

    Das mit der Referenz sieht gut aus, werde mir das mal überlegen.

    @DeSoVoDaMu
    Was ist eine Singleton-Instanz?

    @Pumuckl:
    Die Tips werde ich beherzigen, habe das hier nicht kopiert, sondern reingeschreiben, drum der fehlende Rückgabewert.

    Ich habe nun eine Klasse die von d 2 anderen erbt, somit habe ich alle Funktionen und vor allem meine ID.
    Da diese Klasse ja in der Hauptfunktion als lokale Instanz erzeugt wird, dürfte es keine Probleme wegen mehrfachzugriff geben.

    Sehe ich das so richtig?
    Ist das so gut oder umständlich/unfug?



  • Über Rückgabewerte wollte ich es eigentlich nicht machen, da ich irgendwann mal nimmer durchblick wer was wann zurückgibt.

    Bitte? Aber du blickst durch wenn du fuer jedes Problem dieser Art eine neue Klasse erzeugst? *g*
    Man kann Funktionen auch kommentieren, dann sollte klar werden, was sie zurueckliefern.

    Was ist eine Singleton-Instanz?

    Singleton ist ein Design-Pattern. Es garantiert, dass man von einer Klasse nur ein einziges Objekt hat und auf dieses eigentlich von ueberall Zugriff.
    Dennoch ist es keine globale Variable. Siehe auch hier (4.2.):
    http://magazin.c-plusplus.net/artikel/Einf�hrung in Design Patterns

    Ich habe nun eine Klasse die von d 2 anderen erbt, somit habe ich alle Funktionen und vor allem meine ID. ... Ist das so gut oder umständlich/unfug?

    Zugegebener maßen verstehe ich nicht wirklich, wie dir die Vererbung dabei hilft dein Problem zu lösen, aber gutes Design sieht definitiv anders aus.

    Gruß,
    DeSoVoDaMu



  • Nun wenn ich meine CHttp von Parseenginge uableite dann habe ich alle in CParseengine verfügbaren variablen unter anderem auch meine ID.
    Somit kann ich innerhalb der CHttp, also M_Login meine ID beschreiben und sie in der lokalen funktion auslesen.

    Ich schätze ich habe es oben falsch dargestellt.
    Ich brauche keine Lokale Variable in der FKT_ausgang sondern eine Membervariable von CParseengine.

    Naja wie auch immer, es funktioniert so und ich habe durch diesen Thread wieder neue anreize bekommen.
    Werde mit das mit dem Singleton mal genauer ansehen.

    Vielen Dank für die Hilfe, Mondmann


Log in to reply