Auf Objekt mittels Speicherstelle zugreifen



  • Hallöchen,

    folgende Situation: Ich habe eine Klasse und möchte zur Laufzeit dynamisch Objekte erstellen. Also per

    klasse* name = new klasse;
    

    Nun möchte ich das aber so flexibel halten, dass ich keinen Namen angeben brauche. Also dachte ich mir, ich nehme einen Standard-Namen und erstelle mit diesem Namen einfach eine neues Objekt und lasse das aktuelle im Speicher zurück. Bevor ihr jetzt aufschreit, ich habe vor, die alte Speicherstelle im neuen Objekt zu vermerken um es später zu löschen oder nochmal darauf zurück greifen zu können. (Das alte Objekt bekommt noch die Adresse des neuen Objekts).
    Man soll also zwischen mehreren Datenblöcken welche erstmal ohne direkten Zugriff im Speicher liegen hin und her wandern können, indem man immer das nächste oder vorherige Objekt, welches durch die Speicheradressen angegeben wird, aufrufen kann.

    Beispiel:

    - Erstelle pointer zu Objekt_1 im Speicher + Speicher für Objekt 1 (mittels "object* pointer = new object;")
    - Erstelle Objekt_2 mit gleichem pointer der auf Objekt_1 gezeigt hat, merke Adresse von Daten aus Objekt_1, schreibe in Objekt_1 die neue Adresse von Objekt_2
    - Erstelle Objekt_3 mit Pointer der auf Objekt_2 gezeigt hat, merke Adresse von Daten aus Objekt_2, schreibe in Objekt_2 die neue Adresse von Objekt_3.
    - Versuch auf Objekt 2 zurück zu greifen, also zu Speicherstelle 2 "springen", diese wurde ja in Objekt_3 vermerkt.
    - Objekt_2 ändern und mit Objekt_1 oder Objekt_3 weiter machen...

    Daraus ergibt sich eine Kette:

    Data1 ---> zeigt auf <--- Data2 ---> zeigt auf <--- Data3

    So sollte das etwa ablaufen. Man soll zur Laufzeit also Objekte löschen und hinzufügen können, die Lücken werden (später mal) automatisch neu geknüpft sodass immer eine Liste von Speicherstellen zum vorherigen und nächsten Objekt besteht.

    So sieht ein erster kleiner Entwurf bisher aus:

    #include <iostream>
    
    using namespace std;
    
    class linkedlist
    {
        public:    int* prev;
                    int* next;
                    int* pointer;
    };
    
    class object
    {
        public:    int var1;
                   char var2;
                   char var3;
                   char var4;
    
    };
    
    int main( void )
    {
    
        linkedlist list;
        object* obj = new object;
        (object*)list.pointer = &obj;
        list.prev = NULL;
        list.next = NULL;
    
        obj->var1 = 1;  // Testwert setzen
        // HIER SOLLTE JETZT MITTELS Objekt "list" auf die Attribute des Objekts "obj" zugegriffen werden...
    
        cin.get();
    
        return 0;
    }
    

    //Die Attribute der Klassen sind nur zum Testzweck Public, keine Sorge. 😉

    Ich erstelle also eine Klasse linkedlist welche die Attribute der Speicherstellen des vorherigen und des nachfolgenden Elements beinhalten soll. Und noch einen Pointer zum aktuellen Element welches gerade im Zugriff sich befindet. Daraus erstell ich das Objekt list.
    Dann erstell ich ein Objekt des Typs "Objekt" mittels "new", weise die Speicherstelle des neu erstellten Speicherbereichs dem Attribut "pointer" des Objekts "list" zu.
    Jetzt ist das Problem, wie greife ich auf die Elemente von "obj" über den Pointer in "list" zurück? Ich möchte also nicht mehr mittels obj->var1 etwas ändern sondern über das "list"-Objekt welches die Speicherstelle von "obj" im Attribut "pointer" beinhaltet.
    Ich habe also den Pointer wo sich das Objekt "obj" befindet und möchte nun auf die Variable var1 zurückgreifen um diese etwa in der Konsole auszugeben.
    Ich dachte da an sowas wie cout<<list.pointer->var1;, aber da gibts ne Fehlermeldung die ich nicht zuordnen kann.

    Ich hoffe ihr könnt mir da helfen. 😉

    mfg.

    Ynnus



  • warum machste nicht:

    std::list<foo*> bar;
    bar.push_back(new foo);
    ...
    


  • Ich wollte es eigentlich selber schreiben. Außerdem brauch ich es ja irgendwann vielleicht wieder, auf Objekte so mittels Pointer zuzugreifen. Da wär mir eine eigene Variante lieber. Aber trotzdem danke für den Vorschlag.



  • #include <iostream>
    
    using namespace std;
    
    class object
    {
      public:
      int  var1;
      char var2,
           var3,
           var4;
    
    };
    
    class linkedlist
    {
      public:
      linkedlist *prev,
                 *next;
      object     *pointer; /* wenn pointer ein (int*) ist, */
                           /* kann list.pointer->var1 natürlich */
                           /* nicht funktionieren */
    };
    
    int main( void )
    {
      linkedlist list;
      object *obj = new object;
      list.pointer = obj; /* kein '&'! obj ist ja bereits der zeiger! */
      list.prev = 0; /* NULL ist kein guter C++-stil
      list.next = 0;
    
        obj->var1 = 1;  // Testwert setzen
        // HIER SOLLTE JETZT MITTELS Objekt "list" auf die Attribute des Objekts "obj" zugegriffen werden...
    
        cin.get();
    
        return 0;
    }
    

    wenn du's universeller haben willst, so daß die linkedlist-klasse mit beliebigen klassen funktioniert, dann kannst du's mit templates versuchen:

    #include <iostream>
    
    using namespace std;
    
    class object
    {
      public:
      int  var1;
      char var2,
           var3,
           var4;
    
    };
    
    template<class T>
    class linkedlist
    {
      public:
      linkedlist *prev,
                 *next;
      T          *pointer;
    };
    
    int main( void )
    {
      linkedlist<object> list;
      object *obj = new object;
      list.pointer = obj; /* kein '&'! obj ist ja bereits der zeiger! */
      list.prev = 0; /* NULL ist kein guter C++-stil
      list.next = 0;
    
        obj->var1 = 1;  // Testwert setzen
        // HIER SOLLTE JETZT MITTELS Objekt "list" auf die Attribute des Objekts "obj" zugegriffen werden...
    
        cin.get();
    
        return 0;
    }
    

    übrigens gibts die klasse list auch schon in der c++ standardbibliothek. die macht im gegensatz zu klasse vector genau das, was du mit deiner linkedlist-klasse beabsichtigst.


Anmelden zum Antworten