Zugriff auf Container Klasse.



  • Hallo,

    ich habe ein Problem mit dem Zugriff auf Container.
    Fürs Verständnis wäre es wahrscheinlich das beste ihr würdet das Beispiel kurz überfliegen. Hoffe es ist nicht zu viel - sorry.

    Ich benutze vier Klassen. Drei Klassen besitzen einen Container (map), welcher die vorherige Klasse darin abspeichert.

    Beispiel:

    // Grundklasse
    class Element
    {
        private:
            string name, weitere_infos, ...
            double preis,...
        public:
            // .. Methode zum setzen der Variablen
            void setElement(string name, string weitere_infos, double preis, ...);
            // weitere get-Methoden zum auslesen der Daten
            ...
    };
    
    // Klasse in der alle Elemente (class Element) gespeichert werden
    Class Elements
    {
        private:
            typedef map<string, Element> ElementMap;
            // ... Iterator setzen etc....
            ElementMap ElemMap;
        public:
            bool addElement(string name, string weitere_infos, double preis, ...)
            {
                // neues Element anlegen
                Element NewElement;
                NewElement.setElement(name, weitere_infos, preis, ...);
    
                // Neues Element in Container einfügen
                return ElemMap.insert(ElementVT(name, NewElement)).second;
            };
    
            // Methode zum Zugriff auf ein Element aus dem Container
            void getElement(string element_name)
            {
                ElementIt it = ElemMap.find(element_name);
                if (it == ElemMap.end())
                    cout<< "There is no element with this name!";
                else
                    cout<< "(" << element_name << ")\t" << (*it).second.getElementInfos() << "\t" << (*it).second.getElementPrice();
            };
            ...
    };
    
    // Klasse MaterialCompound defniert die chem. Zusammensetzung
    // eines Materials aus verschiedenen Elementen
    // diese Infos werden auch in einem Map Container abgeleget
    class MaterialCompound :: public Elements
    {
        private:
            typedef map<string, double> MaterialCompoundMap;
            // ... Iterator setzen etc....
            MaterialCompoundMap MatComMap;
    ...
    }
    
    // Oberklasse Materials speichert alle Materialien in einem Contaier
    class Materials :: public MaterialCompound
    {
        private:
            typedef map<string, MaterialCompound> MaterialsMap;
            // ... Iterator setzen etc....
            MaterialsMap MatMap;
        public:
            // Methode zum Hinzufügen eines einzelnen Materials in den Container
            bool addMaterial(const MaterialsVT& mat)
            {
                return MatMap.insert(mat).second;
            };
    
            // !!! Methode die auf die Methode getElement der Klasse Elements zugreift
            void listCompound()
            {
                ...
                this->getElement("string...");
            };
            ...
    };
    

    In meinem Hauptprogramm kann ich jetzt wunderbar die Klassen bzw Container befüllen: (Hinweis: die methoden wurde "nach unten" vererbt!)

    int main()
    {
            // Hier wird der Container der Klasse Elements gefüllt
    	Materials materials;
    	materials.addElement("Al","Aluminium",5.5f);
    	materials.addElement("C","Carbon",7.7);
    	materials.addElement("Fe","Eisen",999.99);
    
            // Hier werden zwei Objekte der Klasse MaterialCompound angelegt und
            // die Zusammensetzungen gespeichert
    	Materials material1;
    	material1.setMaterialName("Ti64");
    	material1.setCompound("Al",6.125);
    	material1.setCompound("C",0.875);
    	material1.setCompound("Ti",90.0);
    	material1.setCompound("Fe",3.0);
    
    	Materials material2;
    	material2.setMaterialName("Ti6242");
    	material2.setCompound("Fe",5.0);
    	material2.setCompound("Al",40.0);
    	material2.setCompound("Ti",55.0);
    
            // Die Beiden Materialzusammensetzungen werden in der Klasse Materials
            // im Container gespeichert
    	materials.addMaterial(make_pair(material1.getMaterialName(),material1));
    	materials.addMaterial(make_pair(material2.getMaterialName(),material2));
    	materials.addMaterial(make_pair(material3.getMaterialName(),material3));
    
        ...
    
        // Direkter Zugriff auf den Elements Container:
        materials.getElement("Name");  // das geht :-)
    
        // Indirekter Zugriff über methode listCompound()
        material1.listCompound();  // geht nicht :-(
    };
    

    Problem:
    Die Klasse Elements verfügt über die Methode "getElement" zur Ausgabe eines Elements. Rufe ich dies methode direkt aus dem Main Programm auf, erhalte ich die Werte.

    Wird diese Methode jedoch "indirekt" über eine andere Klasse aufgerufen, ist der Contaner ElementMap irgendiwe leer und es wird nichts ausgegeben.

    Warum ist das so? Hat es was mit den Konstruktoren bzw Destruktoren zu tun?
    Oder sind die maps nicht untereinander für andere Klassen verfügbar?

    Hoffe ich hab das Problem einigermaße erklärt.

    Danke Oliver



  • Hi

    Kommt mir seltsam vor, deine Vererbung.
    Warum erbt MaterialCompound von Elements?
    Und warum erbt Materials von Compounds?
    Die Beziehung wäre eine "hat eine", also nur der Container.
    Mein Vorschlag:

    // Oberklasse Materials speichert alle Materialien in einem Contaier
    class Materials
    {
        private:
            typedef map<string, MaterialCompound> MaterialsMap;
            typedef MaterialsMap::Iterator        MaterialsIter;
            MaterialsMap MatMap;
        public:
            // Methode zum Hinzufügen eines einzelnen Materials in den Container
            bool addMaterial(string name, const MaterialCompound& mat)
            {
                return MatMap.insert( std::make_pair( name, mat );
            };
    
            // !!! Methode die auf die Methode getElement der Klasse Elements zugreift
            void listCompound()
            {
                for( MaterialsIter it = MatMap.begin(); it != MatMap.end(); ++it )
                {
                    it->second->getElement(it->first);
                }
            };
            ...
    };
    

    ODer sonst hab ich nicht verstanden, was du machen willst.. 😕


Anmelden zum Antworten