[c++] Zugriffsprobleme mit "Owner"-Klasse

yahooooo

Mitglied
Also gut...eigentlich müsste ich das selbst wissen, aber in einem Anflug von Inkompetenz seh ich mich gerade gezwungen, mal jemanden zu fragen, der sich damit auskennt :)

Folgendes: ich habe eine Klasse. Nennen wir sie mal "Verwaltung". Diese enthält mehrere Member-Objekte mit Daten drin:

Code:
class Verwaltung {

  public:
    Verwaltung();
    ~Verwaltung();
    void operation1();

  private:  
    KlasseB member1;
    KlasseC member2;

    //usw
};


So in etwa. Mal angenommen, die Klasse KlasseC enthielte eine Liste vom Typ <list>
Wie kann ich dann darauf aus einer Funktion der Klasse KlasseB darauf zugreifen? Die beiden Klassen müssen sich dafür ja irgendwie kennen.

Ich hab schon den halben Nachmittag mit Zeigern und Referenzen rumhantiert, aber irgendwie krieg ich damit nix gebacken: entweder kompiliert er's gar nicht oder hinterher gibts halt Speicherzugriffsfehler. Was ja irgendwie ärgerlich ist, gelle?

Kann mir da jemand helfen?
 
Zuletzt bearbeitet:
Du könntest dir eine Referenz auf die Liste mittels Getter basteln.
Folgendes Beispiel mag vielleicht nicht viel Sinn machen,
sollte dir aber Zeigen wies geht... (achte auf den Return Wert ;))

Code:
#include <iostream>
#include <list>

using namespace std;

class KlasseC{      

        private:
                list<int> qeue;
        public:

                list<int>& getQeue(){ return qeue; }
};

class KlasseB{

        public:
                void pushElementToListFromC(KlasseC& c_ref, int elem){
                        c_ref.getQeue().push_back(elem);
                }
};

class Verwaltung {

  public:
    Verwaltung(){}
    ~Verwaltung(){}
    void operation1(){
                member1.pushElementToListFromC(member2, 5);
    }

  private:  
    KlasseB member1;
    KlasseC member2;
    //usw
};

int main(){

        Verwaltung v;
        v.operation1();
        v.operation1();
        v.operation1();
}

//edit Wobeu sämtliche Objekte (ausser atomare) immer via Referenz
über/zurückgegeben werden sollten, wegen der Effizienz gell?
Wenn du willst das man das Objekt was zurückgegeben wird nicht verändern
darf, dann mach es einfach const. Ungefähr so:
Code:
const list<int>& getQeue(){ return qeue; }
Gruß

RedWing
 
Zuletzt bearbeitet:
Ja danke erstmal für den Ansatz. Aber ich bin mir gerade nicht sicher, ob ich das richtig verstanden hab. Im Prinzip will ich, dass ich in dem KlasseC-Member eine Möglichkeit habe, direkt auf das KlasseB-Objekt bzw. dessen Zugriffsfunktionen zugreifen kann ohne die Klasse Verwaltung dafür zu benötigen.
Hab dazu mal versucht, den Dingern beim Start des Programms ne Referenz/Zeiger auf das andere Objekt zu geben, aber das hat irgendwie nicht geklappt.


/edit2: ARGH! Total verpeilt...ich arbeite wohl schon zu lang heute. Ich schreib das Problem nochmal genau hin.
 
Zuletzt bearbeitet:
Ich hoff mal ich hab dich nicht wieder falsch verstanden,
vielleicht meinst du es ja so:
Code:
#include <iostream>
#include <list>

using namespace std;

class KlasseB{      

        private:
                list<int> qeue;
        public:
                list<int>& getQeue(){ return qeue; }
};

class KlasseC{      

        
        private:
                KlasseB* member;
        public:

                KlasseC( KlasseB* m):member(m){}
        
                void doSomethingWithB(){
                
                        if(member)
                                member->getQeue().push_back(5);
                }
};

class Verwaltung {

  public:
    Verwaltung(){
        member1 = new KlasseB();
        member2 = new KlasseC(member1);
    }
    ~Verwaltung(){
        delete member1;      
        delete member2;      
    }
    void operation1(){   
                member2->doSomethingWithB();
    }

  private:  
    KlasseB* member1;    
    KlasseC* member2;    
    //usw
};

int main(){

        Verwaltung v;        
        v.operation1();      
        v.operation1();      
        v.operation1();      
}

Gruß

RedWing
 
Nee...Deine erste Antwort hat mich dann doch noch zum Ziel gebracht. Ich hatte das im Prinzip die ganze Zeit so versucht, nur dass ich in der Version, wo ich nix gebacken gekriegt hab, immer versucht hab, die der Funktion übergebenen Referenz einem lokalen Objekt zuzuordnen, um dann damit zu arbeiten. Obwohl das ja gar nicht nötig war. Danke jedenfalls. Hat alles geklappt.
 
Zurück