c++ variable in 2 Klassen aktualisieren

  • Hi!

    Also, ich habe eine Klasse A, in der ich die Variable ptcDetector erstelle. Von A aus rufe ich unabhaengig Klassen B und C auf.
    Klasse B und C haben jeweils eine variable ptcDetector_. Klassen B und C greifen auf eine Methode der Klasse D zu, und verwenden dort die Variable.

    also:
    A {
    new ptcDetector;
    }

    B {
    ptcDetector = 5;
    D.print(ptcDetector);
    }

    C {
    ptcDetecor = 7;
    D.print(ptcDetector);
    }

    D {
    print(ptcDetector);
    }

    hoffe ihr koennt mir helfen. B und C verwenden jeweils ptcDetector, der aber im jeweiligen aktualisiert werden muss.
    z.B: nachdem ich in der Klasse C D.print ausgefuehrt habe, soll sich ptcDetector auch in der Klasse B geaendert haben.

    lg,
    KITT

  • Kannst du bitte folgende 2 Dinge tun:

    1. Dein Code ist nicht C++. Mach ihn dazu.
    2. Ich verstehe deine Frage nicht ganz. Du willst, dass sich die Variable in beiden Klassen B und C updated, wenn du sie in einer der beiden änderst? Dazu brauchst du irgendeine Art von Verbindung zwischen den beiden Klassen. Mangels echtem Code kann man dir aber so nicht weiterhelfen.

    Dipper dipper dii dipper dii dipper dii duuu

  • also so wie ich das verstehe

    du hast eine klasse mit einer variabel und du hast 2 weitere klassen die diese variable verändern

    du möchtest wenn sich die variable in einer der 2 klassen verändert sie sich auch in der anderen ändert

    hier mal ein kleines beispiel wie man es machen kann, die erklärung dazu schreibe ich darunter


    erstmals, wegen der übersicht hab ich nicht jede klasse in eine h und cpp datei unterteilt und nichtmal die implementierung von der deklarierung getrennt sondern alle funktionen sind gleich in den methodendeklarationen der klassen auch definiert, aber das spielt jetzt keine rolle

    anstatt die klassen ABC.. zu nennen hab ich es halt logisch gemacht dass deine A klasse Manager heißt, da sie die variable detector enthält

    dann gibt es B und C welche durch ProcessorA und ProcessorB repräsentiert werden und deine klasse D habe ich als eine abstrakte klasse Visualizer implementiert, bevor ich mit der erklärung anfange, ich schätze das wird schon so verwirrend genug für dich sein, also habe ich auf die verwendung von referenzen verzichtet und nur pointer benutzt, was referenzen sind hat man eh sofort kapiert wenn man das pointer konzept mal richtig begriffen hat also würden sie jetzt nur alles komplizierter machen

    das ganze sieht jetzt so aus, die Manager klasse hat einfach eine int variable

    ich weiß nicht ob du überhaupt schon mit pointern vertraut bist also versuche ich es von 0 weg zu erklären

    wenn ich

    Code
    int x;


    schreibe erstelle ich eine variable x vom typ integer, verändere ich x zb mit x = 4 dann nimmt x den wert 4 an, klar

    ein pointer ist wie der name schon sagt nichts anderes als ein zeiger auf eine variable, ein pointer wird mit * gekennzeichnet

    es kommen zwei neue operatoren hinzu wenn man mit pointern arbeitet und zwar * und &

    wobei * der dereferenzierungsoperator ist und & (ich hab ehrlich gesagt ka wie der operator heißt) operator holt dir die adresse/referenz/pointer von einer variable

    also


    diese pointer sind deswegen da weil wenn ich einen pointerToX1 habe und einen pointerToX2 und beide zeigen auf x und ich x ändere (entweder über x = 4; oder über *pointerToX1 = 4; oder *pointerToX2 = 4) dann naja.. ändere ich halt x und weil die beiden pointer auf x zeigen ändert sie sich demnach für beide pointer

    und so machen wir das

    die manager klasse hat ne detector variable, processora und processorb haben jeweils einen pointer auf die detector variable der manager klasse

    alles was jetzt noch zu tun ist, ist den beiden pointern die adresse der detector variable zuzuteilen, weil data encapsulation ein grundprinzip der oop ist das nicht verletzt werden sollte machen wir die variablen also nicht public sondern erstellen get und set methoden und das ganze läuft jetzt so ab

    die manager klasse hat eine associate funktion die einen pointer auf einen pointer bekommt... also ein zeiger auf einen zeiger auf einen integer (ich schreibe pointer im code immer mit einem p davor, ein pointer auf einen pointer mit p2, pointer auf pointer auf pointer mit p3 usw...)
    dieser pointer auf den pointer auf den integer wird dereferenziert

    also wenn wir int** dereferenzieren bekommen wir ein int* und diesem int* weisen wir jetzt die adresse von detector zu über &detector

    aber wieso zur hölle wird ein int** übergeben? die antwort darauf ist: damit ich den pointer verändern kann.... wenn ich blos einen int* übergeben würde als parameter, wir erinnern uns ein parameter wird als value type übergeben und somit das objekt kopiert, und dann weise ich int* etwas zu dann hätte ich blos die kopie des parameters geändert

    so ähnlich als wenn ich habe

    int x;

    fkt(int x)
    x = 4;

    und ich rufe fkt auf und gebe nach dem aufruf x aus dann ist es nicht 4, weil in der funktion eine kopie von x angefertigt wurde lediglich

    wenn ich also x verändern will müsste ich einen pointer auf x übergeben und den dereferenzierten wert von x ändern dann wäre x auch nach dem funktionsaufruf 4

    int x;

    fkt(int* x)
    *x = 4;

    genauso ist es mit pointern, wenn ich den pointer selbst ändern will muss ich einen pointer auf den intpointer übergeben und diesen dereferenzieren und den intpointer ändern... naja das muss man mal verdauen um es zu verstehen

    jedenfalls erstellen wir in der main einen int** detector, assoziieren den intpointer über die associate methode der manager klasse und dann weisen wir den pointer processora und processorb zu

    das war auch die ganze zauberei dahinter (als wenn das nicht genug wäre *g*).. jedenfalls wenn jetzt detector entweder in manager oder processorA oder processorB geändert wird wird er halt überall geändert

    und ja.. diese visualisierungsklasse hat einfach eine statische methode um ihn auszugeben und nur die manager klasse hat eine get funktion für detector, aber natürlich kannst du detector jetzt einfach in processora oder processorb verwenden, du musst ihn nur einmal dereferenzieren so wie in der changevalue methode

    *m_pDetector = newValue * newValue;

    das ist genauso wie mit dem *x = 4;.. am ja und.. lass dich jetzt nicht von dem * zwischen den newValues verwirren :) das ist einfach nur ein mal zeichen, processorA tut bei change value das quadrat von der überegeben zahl detector zuweisen und processorb 2 * die übergeben zahl

    [FONT=Arial, Helvetica, sans-serif](\__/) [/FONT]
    [FONT=Arial, Helvetica, sans-serif] (='.'=) [/FONT]This is Bunny. Copy Bunny into your signature to help
    [FONT=Arial, Helvetica, sans-serif](")_(")[/FONT] him on his way to world domination.

  • du hast eine klasse mit einer variabel und du hast 2 weitere klassen die diese variable verändern
    du möchtest wenn sich die variable in einer der 2 klassen verändert sie sich auch in der anderen ändert


    Aber wenn du sowieso nur 1 Variable hast, ändert sich die automatisch für alle Clients, egal woher sie geändert wird!

    Dipper dipper dii dipper dii dipper dii duuu

  • mäh... na schön ich formuiere es mal um:

    "du hast eine klasse mit einer variabel und du hast 2 weitere klassen die kopien oder referenzen auf diese variable haben und möchtest dass wenn sich eine der kopien oder referenzen verändert sich die variable in beiden klassen ändert"

    ich nehme das mal so an weil er geschrieben hat er hat ptcDetector in A und 2 variablen ptcDetector_ in B und C

    aber obwohl es so mit den pointern geht würde man es ganz sicher nicht so lösen sondern wie sauzachn gesagt hat, die variable in klasse A einfach nur ein mal abspeichern, B und C hätten eine referenz auf A und über A.Get/SetPtcDetector() greifen beide auf ptcDetector zu anstatt dass sie jeweils eine ptcDetector_ variable haben

    alternativ wenn du keine referenz auf A in B und C haben willst kannst du ptcDetector in A static machen und über A::Get/SetPtcDetector() darauf zugreifen

    [FONT=Arial, Helvetica, sans-serif](\__/) [/FONT]
    [FONT=Arial, Helvetica, sans-serif] (='.'=) [/FONT]This is Bunny. Copy Bunny into your signature to help
    [FONT=Arial, Helvetica, sans-serif](")_(")[/FONT] him on his way to world domination.

  • vielen dank vevusio!
    also das prinzip scheint klar. aber wie mache ich das in der main methode mit
    int** detector = new int*;
    falls detector eine map < unsigned short, pair < unsigned short, bool > >
    ist?
    map<...>** detector = new map<...>*
    ?

    lg,
    KITT

  • also das prinzip scheint klar. aber wie mache ich das in der main methode mit
    int** detector = new int*;
    falls detector eine map < unsigned short, pair < unsigned short, bool > >
    ist?
    map<...>** detector = new map<...>*
    ?


    Nein, so direkt geht das nicht. Ein ** ist ein Zeiger auf einen Zeiger. Du musst zuerst eine normale Zeigervariable anlegen und dann erst einen Zeiger auf diese Variable machen. In Langform:

    Code
    map<blabla>* m = new map<blabla>(...);
    map<blabla>** mm = &m;


    Früher (und mit manchen Compilern wohl heute noch) ging auch:

    Code
    map<blabla>** m = &(new map<blabla>(...));


    Das ist aber kein gültiges C++ (wurde im GCC AFAIR erst eher spät als Fehler ausgegeben).

    Dipper dipper dii dipper dii dipper dii duuu

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!