<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Zugriff auf Container Klasse.]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Problem mit dem Zugriff auf Container.<br />
Fürs Verständnis wäre es wahrscheinlich das beste ihr würdet das Beispiel kurz überfliegen. Hoffe es ist nicht zu viel - sorry.</p>
<p>Ich benutze vier Klassen. Drei Klassen besitzen einen Container (map), welcher die vorherige Klasse darin abspeichert.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">// 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&lt;string, Element&gt; 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&lt;&lt; &quot;There is no element with this name!&quot;;
            else
                cout&lt;&lt; &quot;(&quot; &lt;&lt; element_name &lt;&lt; &quot;)\t&quot; &lt;&lt; (*it).second.getElementInfos() &lt;&lt; &quot;\t&quot; &lt;&lt; (*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&lt;string, double&gt; MaterialCompoundMap;
        // ... Iterator setzen etc....
        MaterialCompoundMap MatComMap;
...
}

// Oberklasse Materials speichert alle Materialien in einem Contaier
class Materials :: public MaterialCompound
{
    private:
        typedef map&lt;string, MaterialCompound&gt; MaterialsMap;
        // ... Iterator setzen etc....
        MaterialsMap MatMap;
    public:
        // Methode zum Hinzufügen eines einzelnen Materials in den Container
        bool addMaterial(const MaterialsVT&amp; mat)
        {
            return MatMap.insert(mat).second;
        };

        // !!! Methode die auf die Methode getElement der Klasse Elements zugreift
        void listCompound()
        {
            ...
            this-&gt;getElement(&quot;string...&quot;);
        };
        ...
};
</code></pre>
<p>In meinem Hauptprogramm kann ich jetzt wunderbar die Klassen bzw Container befüllen: (Hinweis: die methoden wurde &quot;nach unten&quot; vererbt!)</p>
<pre><code class="language-cpp">int main()
{
        // Hier wird der Container der Klasse Elements gefüllt
	Materials materials;
	materials.addElement(&quot;Al&quot;,&quot;Aluminium&quot;,5.5f);
	materials.addElement(&quot;C&quot;,&quot;Carbon&quot;,7.7);
	materials.addElement(&quot;Fe&quot;,&quot;Eisen&quot;,999.99);

        // Hier werden zwei Objekte der Klasse MaterialCompound angelegt und
        // die Zusammensetzungen gespeichert
	Materials material1;
	material1.setMaterialName(&quot;Ti64&quot;);
	material1.setCompound(&quot;Al&quot;,6.125);
	material1.setCompound(&quot;C&quot;,0.875);
	material1.setCompound(&quot;Ti&quot;,90.0);
	material1.setCompound(&quot;Fe&quot;,3.0);

	Materials material2;
	material2.setMaterialName(&quot;Ti6242&quot;);
	material2.setCompound(&quot;Fe&quot;,5.0);
	material2.setCompound(&quot;Al&quot;,40.0);
	material2.setCompound(&quot;Ti&quot;,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(&quot;Name&quot;);  // das geht :-)

    // Indirekter Zugriff über methode listCompound()
    material1.listCompound();  // geht nicht :-(
};
</code></pre>
<p>Problem:<br />
Die Klasse Elements verfügt über die Methode &quot;getElement&quot; zur Ausgabe eines Elements. Rufe ich dies methode direkt aus dem Main Programm auf, erhalte ich die Werte.</p>
<p>Wird diese Methode jedoch &quot;indirekt&quot; über eine andere Klasse aufgerufen, ist der Contaner ElementMap irgendiwe leer und es wird nichts ausgegeben.</p>
<p>Warum ist das so? Hat es was mit den Konstruktoren bzw Destruktoren zu tun?<br />
Oder sind die maps nicht untereinander für andere Klassen verfügbar?</p>
<p>Hoffe ich hab das Problem einigermaße erklärt.</p>
<p>Danke Oliver</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/156795/zugriff-auf-container-klasse</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 22:10:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/156795.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 20 Aug 2006 10:49:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zugriff auf Container Klasse. on Sun, 20 Aug 2006 10:49:26 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Problem mit dem Zugriff auf Container.<br />
Fürs Verständnis wäre es wahrscheinlich das beste ihr würdet das Beispiel kurz überfliegen. Hoffe es ist nicht zu viel - sorry.</p>
<p>Ich benutze vier Klassen. Drei Klassen besitzen einen Container (map), welcher die vorherige Klasse darin abspeichert.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">// 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&lt;string, Element&gt; 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&lt;&lt; &quot;There is no element with this name!&quot;;
            else
                cout&lt;&lt; &quot;(&quot; &lt;&lt; element_name &lt;&lt; &quot;)\t&quot; &lt;&lt; (*it).second.getElementInfos() &lt;&lt; &quot;\t&quot; &lt;&lt; (*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&lt;string, double&gt; MaterialCompoundMap;
        // ... Iterator setzen etc....
        MaterialCompoundMap MatComMap;
...
}

// Oberklasse Materials speichert alle Materialien in einem Contaier
class Materials :: public MaterialCompound
{
    private:
        typedef map&lt;string, MaterialCompound&gt; MaterialsMap;
        // ... Iterator setzen etc....
        MaterialsMap MatMap;
    public:
        // Methode zum Hinzufügen eines einzelnen Materials in den Container
        bool addMaterial(const MaterialsVT&amp; mat)
        {
            return MatMap.insert(mat).second;
        };

        // !!! Methode die auf die Methode getElement der Klasse Elements zugreift
        void listCompound()
        {
            ...
            this-&gt;getElement(&quot;string...&quot;);
        };
        ...
};
</code></pre>
<p>In meinem Hauptprogramm kann ich jetzt wunderbar die Klassen bzw Container befüllen: (Hinweis: die methoden wurde &quot;nach unten&quot; vererbt!)</p>
<pre><code class="language-cpp">int main()
{
        // Hier wird der Container der Klasse Elements gefüllt
	Materials materials;
	materials.addElement(&quot;Al&quot;,&quot;Aluminium&quot;,5.5f);
	materials.addElement(&quot;C&quot;,&quot;Carbon&quot;,7.7);
	materials.addElement(&quot;Fe&quot;,&quot;Eisen&quot;,999.99);

        // Hier werden zwei Objekte der Klasse MaterialCompound angelegt und
        // die Zusammensetzungen gespeichert
	Materials material1;
	material1.setMaterialName(&quot;Ti64&quot;);
	material1.setCompound(&quot;Al&quot;,6.125);
	material1.setCompound(&quot;C&quot;,0.875);
	material1.setCompound(&quot;Ti&quot;,90.0);
	material1.setCompound(&quot;Fe&quot;,3.0);

	Materials material2;
	material2.setMaterialName(&quot;Ti6242&quot;);
	material2.setCompound(&quot;Fe&quot;,5.0);
	material2.setCompound(&quot;Al&quot;,40.0);
	material2.setCompound(&quot;Ti&quot;,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(&quot;Name&quot;);  // das geht :-)

    // Indirekter Zugriff über methode listCompound()
    material1.listCompound();  // geht nicht :-(
};
</code></pre>
<p>Problem:<br />
Die Klasse Elements verfügt über die Methode &quot;getElement&quot; zur Ausgabe eines Elements. Rufe ich dies methode direkt aus dem Main Programm auf, erhalte ich die Werte.</p>
<p>Wird diese Methode jedoch &quot;indirekt&quot; über eine andere Klasse aufgerufen, ist der Contaner ElementMap irgendiwe leer und es wird nichts ausgegeben.</p>
<p>Warum ist das so? Hat es was mit den Konstruktoren bzw Destruktoren zu tun?<br />
Oder sind die maps nicht untereinander für andere Klassen verfügbar?</p>
<p>Hoffe ich hab das Problem einigermaße erklärt.</p>
<p>Danke Oliver</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1120803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1120803</guid><dc:creator><![CDATA[netraxo]]></dc:creator><pubDate>Sun, 20 Aug 2006 10:49:26 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf Container Klasse. on Sun, 20 Aug 2006 12:37:08 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>Kommt mir seltsam vor, deine Vererbung.<br />
Warum erbt MaterialCompound von Elements?<br />
Und warum erbt Materials von Compounds?<br />
Die Beziehung wäre eine &quot;hat eine&quot;, also nur der Container.<br />
Mein Vorschlag:</p>
<pre><code class="language-cpp">// Oberklasse Materials speichert alle Materialien in einem Contaier
class Materials
{
    private:
        typedef map&lt;string, MaterialCompound&gt; MaterialsMap;
        typedef MaterialsMap::Iterator        MaterialsIter;
        MaterialsMap MatMap;
    public:
        // Methode zum Hinzufügen eines einzelnen Materials in den Container
        bool addMaterial(string name, const MaterialCompound&amp; 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-&gt;second-&gt;getElement(it-&gt;first);
            }
        };
        ...
};
</code></pre>
<p>ODer sonst hab ich nicht verstanden, was du machen willst.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1120847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1120847</guid><dc:creator><![CDATA[Chemie Fan]]></dc:creator><pubDate>Sun, 20 Aug 2006 12:37:08 GMT</pubDate></item></channel></rss>