<?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[Problem mit verketteter liste]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe mir eine Template-Klasse geschrieben, in der man Objekte beliebigen Types einfügen etc. kann.</p>
<p>Außerdem habe ich eine Vaterklasse mit 2 Kindklassen. Beide Kindklassen möchte ich in eine verkettete Liste einfügen. Geht dies? Oder muss ich von jeder KLasse eine extra Liste machen?</p>
<p>Hier meine template:<br />
Headerfile:</p>
<pre><code class="language-cpp">// liste.h

/*
Klasse LISTE (verkettete Liste Template)
*/
/*
History:
	25.04.2006
*/

template &lt;class T&gt;class LISTE
{
	private:

   	class ELEMENT
      {
      	private:

         	T 					daten;
            /*
            Daten des Elements
            */
            ELEMENT 	*next;
            /*
            Zeiger auf das nächste Element
            */

         public:

         	ELEMENT( T &amp;uebergabe);
            /*
            Standardkonstruktor der Elemente der Liste
            */
            ~ELEMENT();
            /*
            Destruktor
            */
            // Methoden:
            void setDaten( T &amp;uebergabe);
            /*
           	setzen der Daten
            */
				 T &amp;getDaten();
				/*
            Lesen der Daten
            */
            ELEMENT *getNext();
            /*
            gibt das nächste Element zurück
            */
            void setNext( ELEMENT *next_neu );
            /*
            Setzt den Zeiger auf das nächste Element neu
            */

            ELEMENT *sWert( T &amp;wert );
            /*
            Durchsucht alle Elemente nach einem bestimmten wert
            */

            void dahinter_einf( T &amp;wert);
            /*
            fügt hinter sich ein Element ein
            */
      };
      ELEMENT *start;
      /*
      Zeiger auf das Element start wird deklariert
      */

   public:

      LISTE();
      /*
      Standardkonstruktor der Liste: setzt start auf NULL
      */
      ~LISTE();
      /*
      Destruktor der Liste:  gibt die Elemente der Liste frei
      */
      void hinten_einf( T &amp;wert);
      /*
      Methode zum einfügen eines Elements am Ende der Liste
      */
       T *sucheWert( T &amp;wert );
};
</code></pre>
<p>.cpp file:</p>
<pre><code class="language-cpp">/*liste.cpp*/

/*
Klasse LISTE (verkettete Liste Template)
*/
/*
History:
	01.04.2006
*/
#include &lt;stdio.h&gt;
#include &lt;io.h&gt;
#include &lt;stdlib.h&gt;
#include &quot;makros.h&quot;
#include &quot;liste.h&quot;

template&lt;class T&gt;
LISTE&lt;T&gt;::ELEMENT::ELEMENT( T &amp;uebergabe)
{
   daten = uebergabe;
   next = NULL;
}
/*
Standardkonstruktor der Elemente der Liste
*/
template&lt;class T&gt;
LISTE&lt;T&gt;::ELEMENT:: ~ELEMENT()
{
   delete next;
}
/*
Destruktor
Achtung:
Weil das delete next den Destruktor gleich wieder
für das nächste Element aufruft, in dem wiederum ein delete next
steht, wird rekursiv die gesamte Liste ab dem aktuellen Element
freigegeben!
Wenn man nur ein Element freigeben will, aber nicht das nächste,
dann muß man zuvor sein next zu NULL setzen!
*/
// Methoden:
template&lt;class T&gt;
void setDaten( T &amp;uebergabe)
{
   daten = uebergabe;    //setzt die Daten
}
/*
setzen der Daten
*/
template&lt;class T&gt;
 T &amp;getDaten()
{
   return daten;     //gibt die Daten des Elements zurück
}
/*
Lesen der Daten
*/
template&lt;class T&gt;
ELEMENT LISTE&lt;T&gt;::ELEMENT::*getNext()
{
   return next;     //gibt das nächste Element zurück
}
/*
gibt das nächste Element zurück
*/
template&lt;class T&gt;
void LISTE&lt;T&gt;::ELEMENT::setNext( ELEMENT *next_neu )
{
   next = next_neu;
}
/*
Setzt den Zeiger auf das nächste Element neu
*/
template&lt;class T&gt;
ELEMENT *sWert( T &amp;wert )
{
   // Schleife notfalls über alle Elemente:
   ELEMENT *aktuellesElement = this;
   do
   {
      if( aktuellesElement-&gt;getDaten()==wert )
      {
         return aktuellesElement;
      }
      aktuellesElement = aktuellesElement-&gt;getNext();
   }
   while( aktuellesElement!=NULL );

   return NULL;
}
/*
Durchsucht alle Elemente nach einem bestimmten wert
*/
template&lt;class T&gt;
void dahinter_einf( T &amp;wert)
{
   ELEMENT *uebernaechster = next;  // bisherigers nächstes Element merken

   next = new ELEMENT( wert );  //neues Element schaffen

   next-&gt;setNext( uebernaechster ); //bisheriges nächstes Element dahinter setzen
}
template&lt;class T&gt;
LISTE&lt;T&gt;::LISTE()
{
   start = NULL; //start ist zunächst auch das letzte Element, also Adresse NULL
}
/*
Standardkonstruktor der Liste: setzt start auf NULL
*/

template&lt;class T&gt;
LISTE&lt;T&gt;::~LISTE()
{
   delete start; //gibt die Listen ELemente frei
}
/*
Destruktor der Liste:  gibt die Elemente der Liste frei
*/
template&lt;class T&gt;
void LISTE&lt;T&gt;::hinten_einf( T &amp;wert)
{
   if(start == NULL)    // Wenn liste noch leer dann füge es am anfang ein
   {
      start = new ELEMENT (wert);
   }
   else
   {
      ELEMENT *ende = start;
      // Suche nach dem letzten ELement
      while (ende-&gt;getNext() != NULL)
      {
         ende = ende-&gt;getNext();
      }
      // letztes Element gefunden =&gt; dahinter einfügen
      ende-&gt;dahinter_einf(wert);
   }
}
/*
Methode zum einfügen eines Elements am Ende der Liste
*/
template&lt;class T&gt;
LISTE&lt;T&gt;::T *sucheWert( T &amp;wert )
{
   // Ist die Liste leer?
   if( start==NULL )
   {
      return NULL;
   }
   else
   {
      ELEMENT *gefunden = start-&gt;sWert( wert );
      if(gefunden != NULL)
      {
         return &amp;(gefunden-&gt;getDaten());
      }
      else
      {
         return NULL;
      }
   }
}
</code></pre>
<p>Wie kann ich jetzt in der main eine liste erstellen mit objekten der kindklassen?</p>
<p>so?</p>
<pre><code class="language-cpp">LISTE&lt;VATERKLASSE&gt; liste;

KINDKLASSE objekt;

liste.hinten_einf(objekt);
</code></pre>
<p>so konnte ich die methoden der kindklasse irgendwie nicht mehr aufrufen, kann das sein oder müsste das normal gehen?</p>
<p>Bin noch Schüler und brauche unbedingt hilfe...</p>
<p>Gruß Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/145280/problem-mit-verketteter-liste</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 23:42:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/145280.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 26 Apr 2006 14:17:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit verketteter liste on Wed, 26 Apr 2006 14:17:41 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe mir eine Template-Klasse geschrieben, in der man Objekte beliebigen Types einfügen etc. kann.</p>
<p>Außerdem habe ich eine Vaterklasse mit 2 Kindklassen. Beide Kindklassen möchte ich in eine verkettete Liste einfügen. Geht dies? Oder muss ich von jeder KLasse eine extra Liste machen?</p>
<p>Hier meine template:<br />
Headerfile:</p>
<pre><code class="language-cpp">// liste.h

/*
Klasse LISTE (verkettete Liste Template)
*/
/*
History:
	25.04.2006
*/

template &lt;class T&gt;class LISTE
{
	private:

   	class ELEMENT
      {
      	private:

         	T 					daten;
            /*
            Daten des Elements
            */
            ELEMENT 	*next;
            /*
            Zeiger auf das nächste Element
            */

         public:

         	ELEMENT( T &amp;uebergabe);
            /*
            Standardkonstruktor der Elemente der Liste
            */
            ~ELEMENT();
            /*
            Destruktor
            */
            // Methoden:
            void setDaten( T &amp;uebergabe);
            /*
           	setzen der Daten
            */
				 T &amp;getDaten();
				/*
            Lesen der Daten
            */
            ELEMENT *getNext();
            /*
            gibt das nächste Element zurück
            */
            void setNext( ELEMENT *next_neu );
            /*
            Setzt den Zeiger auf das nächste Element neu
            */

            ELEMENT *sWert( T &amp;wert );
            /*
            Durchsucht alle Elemente nach einem bestimmten wert
            */

            void dahinter_einf( T &amp;wert);
            /*
            fügt hinter sich ein Element ein
            */
      };
      ELEMENT *start;
      /*
      Zeiger auf das Element start wird deklariert
      */

   public:

      LISTE();
      /*
      Standardkonstruktor der Liste: setzt start auf NULL
      */
      ~LISTE();
      /*
      Destruktor der Liste:  gibt die Elemente der Liste frei
      */
      void hinten_einf( T &amp;wert);
      /*
      Methode zum einfügen eines Elements am Ende der Liste
      */
       T *sucheWert( T &amp;wert );
};
</code></pre>
<p>.cpp file:</p>
<pre><code class="language-cpp">/*liste.cpp*/

/*
Klasse LISTE (verkettete Liste Template)
*/
/*
History:
	01.04.2006
*/
#include &lt;stdio.h&gt;
#include &lt;io.h&gt;
#include &lt;stdlib.h&gt;
#include &quot;makros.h&quot;
#include &quot;liste.h&quot;

template&lt;class T&gt;
LISTE&lt;T&gt;::ELEMENT::ELEMENT( T &amp;uebergabe)
{
   daten = uebergabe;
   next = NULL;
}
/*
Standardkonstruktor der Elemente der Liste
*/
template&lt;class T&gt;
LISTE&lt;T&gt;::ELEMENT:: ~ELEMENT()
{
   delete next;
}
/*
Destruktor
Achtung:
Weil das delete next den Destruktor gleich wieder
für das nächste Element aufruft, in dem wiederum ein delete next
steht, wird rekursiv die gesamte Liste ab dem aktuellen Element
freigegeben!
Wenn man nur ein Element freigeben will, aber nicht das nächste,
dann muß man zuvor sein next zu NULL setzen!
*/
// Methoden:
template&lt;class T&gt;
void setDaten( T &amp;uebergabe)
{
   daten = uebergabe;    //setzt die Daten
}
/*
setzen der Daten
*/
template&lt;class T&gt;
 T &amp;getDaten()
{
   return daten;     //gibt die Daten des Elements zurück
}
/*
Lesen der Daten
*/
template&lt;class T&gt;
ELEMENT LISTE&lt;T&gt;::ELEMENT::*getNext()
{
   return next;     //gibt das nächste Element zurück
}
/*
gibt das nächste Element zurück
*/
template&lt;class T&gt;
void LISTE&lt;T&gt;::ELEMENT::setNext( ELEMENT *next_neu )
{
   next = next_neu;
}
/*
Setzt den Zeiger auf das nächste Element neu
*/
template&lt;class T&gt;
ELEMENT *sWert( T &amp;wert )
{
   // Schleife notfalls über alle Elemente:
   ELEMENT *aktuellesElement = this;
   do
   {
      if( aktuellesElement-&gt;getDaten()==wert )
      {
         return aktuellesElement;
      }
      aktuellesElement = aktuellesElement-&gt;getNext();
   }
   while( aktuellesElement!=NULL );

   return NULL;
}
/*
Durchsucht alle Elemente nach einem bestimmten wert
*/
template&lt;class T&gt;
void dahinter_einf( T &amp;wert)
{
   ELEMENT *uebernaechster = next;  // bisherigers nächstes Element merken

   next = new ELEMENT( wert );  //neues Element schaffen

   next-&gt;setNext( uebernaechster ); //bisheriges nächstes Element dahinter setzen
}
template&lt;class T&gt;
LISTE&lt;T&gt;::LISTE()
{
   start = NULL; //start ist zunächst auch das letzte Element, also Adresse NULL
}
/*
Standardkonstruktor der Liste: setzt start auf NULL
*/

template&lt;class T&gt;
LISTE&lt;T&gt;::~LISTE()
{
   delete start; //gibt die Listen ELemente frei
}
/*
Destruktor der Liste:  gibt die Elemente der Liste frei
*/
template&lt;class T&gt;
void LISTE&lt;T&gt;::hinten_einf( T &amp;wert)
{
   if(start == NULL)    // Wenn liste noch leer dann füge es am anfang ein
   {
      start = new ELEMENT (wert);
   }
   else
   {
      ELEMENT *ende = start;
      // Suche nach dem letzten ELement
      while (ende-&gt;getNext() != NULL)
      {
         ende = ende-&gt;getNext();
      }
      // letztes Element gefunden =&gt; dahinter einfügen
      ende-&gt;dahinter_einf(wert);
   }
}
/*
Methode zum einfügen eines Elements am Ende der Liste
*/
template&lt;class T&gt;
LISTE&lt;T&gt;::T *sucheWert( T &amp;wert )
{
   // Ist die Liste leer?
   if( start==NULL )
   {
      return NULL;
   }
   else
   {
      ELEMENT *gefunden = start-&gt;sWert( wert );
      if(gefunden != NULL)
      {
         return &amp;(gefunden-&gt;getDaten());
      }
      else
      {
         return NULL;
      }
   }
}
</code></pre>
<p>Wie kann ich jetzt in der main eine liste erstellen mit objekten der kindklassen?</p>
<p>so?</p>
<pre><code class="language-cpp">LISTE&lt;VATERKLASSE&gt; liste;

KINDKLASSE objekt;

liste.hinten_einf(objekt);
</code></pre>
<p>so konnte ich die methoden der kindklasse irgendwie nicht mehr aufrufen, kann das sein oder müsste das normal gehen?</p>
<p>Bin noch Schüler und brauche unbedingt hilfe...</p>
<p>Gruß Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1045735</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1045735</guid><dc:creator><![CDATA[matrix444]]></dc:creator><pubDate>Wed, 26 Apr 2006 14:17:41 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit verketteter liste on Wed, 26 Apr 2006 14:27:48 GMT]]></title><description><![CDATA[<p>Hallo</p>
<blockquote>
<p>Beide Kindklassen möchte ich in eine verkettete Liste einfügen. Geht dies? Oder muss ich von jeder KLasse eine extra Liste machen?</p>
</blockquote>
<p>Wenn die Liste vom Vatertyp ist, kannst du Instanzen von beiden Kindklassen einfügen.</p>
<blockquote>
<p>so konnte ich die methoden der kindklasse irgendwie nicht mehr aufrufen, kann das sein oder müsste das normal gehen?</p>
</blockquote>
<p>Daraus folgt das du auf die Objekte der Liste ausschließlich über die Member zugreifen kannst, die die vaterklase bereitstellt.<br />
Deshalb mus die Vaterklasse eben alle notwendigen Funktionen als virtuell definiert haben haben, die dann von den Kinderklassen überschrieben werden.<br />
Siehe <a href="http://tutorial.schornboeck.net/virtual.htm" rel="nofollow">Polymorphie</a>.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1045739</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1045739</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Wed, 26 Apr 2006 14:27:48 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit verketteter liste on Wed, 26 Apr 2006 14:26:29 GMT]]></title><description><![CDATA[<p>Du musst in der Liste Zeiger von T speichern, damit das mit der Polymorphie klappt. Denn Du kannst mit &quot;new Kind1(...)&quot; ein Kind1* erzeugen, aber als Vater* in die Liste legen, kein Problem.</p>
<p>Dass Du die Methoden der Kindklasse auf einem Vater* nicht aufrufen kannst ist völlig normal, das hätte mit Polymorphie auch nichts zu tun. Bei einem guten Design ist in der Vaterklasse alles (notfalls abstrakt, d.h. rein virtuell) definiert was nötig ist um auf die Daten aller Kinder zuzugreifen (nennt man dann &quot;gutes Interface&quot; <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> )</p>
<pre><code class="language-cpp">class Vater {
  virtual void tuWas() = 0;
};

class Kind1: Vater {
  virtual void tuWas() { tu_was_1iges(); }
};

class Kind2: Vater {
  virtual void tuWas() { tu_was_2iges(); }
};

/* ... */
Vater *objekt = LISTE.sucheWert(...);
objekt-&gt;tuWas(); // tut was 1iges oder auch was 2iges, je nachdem was in der Liste mal gespeichert wurde.
</code></pre>
<p>Deine Such-Methode erschliesst sich mir noch nicht so ganz: Du suchst anhand eines T ein T? (Will heissen: Du brauchst das Objekt, was Du suchst, um nach ihm zu suchen?!)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1045740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1045740</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 26 Apr 2006 14:26:29 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit verketteter liste on Wed, 26 Apr 2006 17:01:19 GMT]]></title><description><![CDATA[<p>Ok erstmal danke.</p>
<p>Habe jetzt eine Liste vom typ der vaterklasse angelegt. Dann die die Kindklasse hineingefügt.</p>
<p>So:</p>
<pre><code class="language-cpp">LISTE&lt;VATER&gt; liste; 

for(iI=0;iI&lt;iAnzK1;iI++)
{
     KIND1 s(iSeriennummer);
     liste.hinten_einf(s);
     iSeriennummer++;
}

for(iI=0;iI&lt;iAnzK2;iI++)
{
     KIND2 s(iSeriennummer);
     liste.hinten_einf(s);
     Seriennummer++;
}
</code></pre>
<p>habe die methoden alle virtual gemacht etc.</p>
<p>nur jetzt will ich die gesamte Liste durchsuchen mit:</p>
<pre><code class="language-cpp">for(iI=0;iI&lt;bla;iI++)
{
     pZeiger_auf_Objekt = liste.sucheWert(VATER(iI));
     ...
</code></pre>
<p>da es in der vaterklasse natürlich keinen konsruktor gibt der so aussieht, kommt eine fehlermeldung.</p>
<p>kann man die konsrtuktoren auch virtual machen? bzw. welcher wird zuerst aufgerufen etc.</p>
<p>wie soll ich dieses problem lösen?</p>
<p>weil ich ja nur mit suche_wert die liste durchgehen kann...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1045859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1045859</guid><dc:creator><![CDATA[matrix444]]></dc:creator><pubDate>Wed, 26 Apr 2006 17:01:19 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit verketteter liste on Wed, 26 Apr 2006 17:52:35 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">LISTE&lt;VATER*&gt; liste; // &lt;---

for (int iI=0;iI&lt;iAnzK1;iI++) // &lt;---
{
     KIND1* s = new KIND1(iSeriennummer); // &lt;---
     liste.hinten_einf(s);
     iSeriennummer++;
}
// dto for KIND2
</code></pre>
<p>matrix444 schrieb:</p>
<blockquote>
<p>wie soll ich dieses problem lösen?</p>
</blockquote>
<p>Lass dich von der STL inspirieren. Stell Iteratoren zur Verfügung und benutze <em>std::find_if</em> (oder bilde es zu Lernzwecken nach, wie auch immer).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1045894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1045894</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Wed, 26 Apr 2006 17:52:35 GMT</pubDate></item></channel></rss>