<?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[templates und pointer]]></title><description><![CDATA[<p>hallo leute,</p>
<p>ich habe eine klasse für eine liste erstellt. die soll verschiedenartige nodes aufnehmen können (alle von einer hauptnode abgeleitet). dazu habe ich templates benutzt.</p>
<p>wenn ich nun einen pointer auf solch eine liste setze und mit new speicherplatz anfordere kommt immer ein compiler fehler. irgendwie bin ich mit meinem latain dort am ende. vielleicht habt ihr eine lösung für dies problem.</p>
<p>hier mal der quelltext:<br />
an folgender stelle meldet gcc und windows immer &quot;undefined reference to 'List::&lt;Buchungen&gt;::List()'&quot;</p>
<pre><code class="language-cpp">int main()
{
    List&lt;Buchungen&gt;* ll = new List&lt;Buchungen&gt;();
    return 0;
}
</code></pre>
<p>meine listen klasse:</p>
<pre><code class="language-cpp">#ifndef LIST_H_
#define LIST_H_

#include &quot;Node.h&quot;

template &lt;class NodeType&gt; class List
{
private:
	NodeType *first;
	NodeType *last;
	int count;

public:
	List(void);
	~List(void);

	int getCount(void);

	NodeType * getFirstNode(void);
	NodeType * getLastNode(void);

	void addNodeBack(NodeType * n);
	void addNodeFront(NodeType * n);

	void deleteFirstNode();

	void insertAfter(NodeType * n, NodeType * ne);

	void sortInsertion(int (NodeType::*comparator)(NodeType *));
};

#endif /*LIST_H_*/
</code></pre>
<p>die node</p>
<pre><code class="language-cpp">#ifndef NODE_H_
#define NODE_H_

class Node
{
	//friend class List;

protected:
	Node* next;
	void setNext(Node* n);

public:
	Node(void);
	~Node(void);

	Node* getNext();

	int comparator(Node *);
};

#endif /*NODE_H_*/
</code></pre>
<p>und die abgeleitete klasse buchungen</p>
<pre><code class="language-cpp">#ifndef BUCHUNGEN_H_
#define BUCHUNGEN_H_

#include &quot;Node.h&quot;
#include &lt;string&gt;
using namespace std;

class Buchungen : public Node {
private:
	double Betrag;
	int Menge;
	string* BuchText;
	string* KontoText;

public:
	Buchungen(void);
	~Buchungen(void);

	void setBetrag(double b);
	void setMenge(int m);
	void setBuchText(string* bt);
	void setKontoText(string* kt);

	double getBetrag(void);
	int getMenge(void);
	string* getBuchText(void);
	string* getKontoText(void);

	int compareToBetrag(Buchungen* c);
	int compareToMenge(Buchungen* c);
	int compareToBuchText(Buchungen* c);
	int compareToKontoText(Buchungen* c);
};
#endif /*BUCHUNGEN_H_*/
</code></pre>
<p>vielen dank,<br />
sjoe</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/166194/templates-und-pointer</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 07:43:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/166194.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 27 Nov 2006 08:24:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to templates und pointer on Mon, 27 Nov 2006 08:24:04 GMT]]></title><description><![CDATA[<p>hallo leute,</p>
<p>ich habe eine klasse für eine liste erstellt. die soll verschiedenartige nodes aufnehmen können (alle von einer hauptnode abgeleitet). dazu habe ich templates benutzt.</p>
<p>wenn ich nun einen pointer auf solch eine liste setze und mit new speicherplatz anfordere kommt immer ein compiler fehler. irgendwie bin ich mit meinem latain dort am ende. vielleicht habt ihr eine lösung für dies problem.</p>
<p>hier mal der quelltext:<br />
an folgender stelle meldet gcc und windows immer &quot;undefined reference to 'List::&lt;Buchungen&gt;::List()'&quot;</p>
<pre><code class="language-cpp">int main()
{
    List&lt;Buchungen&gt;* ll = new List&lt;Buchungen&gt;();
    return 0;
}
</code></pre>
<p>meine listen klasse:</p>
<pre><code class="language-cpp">#ifndef LIST_H_
#define LIST_H_

#include &quot;Node.h&quot;

template &lt;class NodeType&gt; class List
{
private:
	NodeType *first;
	NodeType *last;
	int count;

public:
	List(void);
	~List(void);

	int getCount(void);

	NodeType * getFirstNode(void);
	NodeType * getLastNode(void);

	void addNodeBack(NodeType * n);
	void addNodeFront(NodeType * n);

	void deleteFirstNode();

	void insertAfter(NodeType * n, NodeType * ne);

	void sortInsertion(int (NodeType::*comparator)(NodeType *));
};

#endif /*LIST_H_*/
</code></pre>
<p>die node</p>
<pre><code class="language-cpp">#ifndef NODE_H_
#define NODE_H_

class Node
{
	//friend class List;

protected:
	Node* next;
	void setNext(Node* n);

public:
	Node(void);
	~Node(void);

	Node* getNext();

	int comparator(Node *);
};

#endif /*NODE_H_*/
</code></pre>
<p>und die abgeleitete klasse buchungen</p>
<pre><code class="language-cpp">#ifndef BUCHUNGEN_H_
#define BUCHUNGEN_H_

#include &quot;Node.h&quot;
#include &lt;string&gt;
using namespace std;

class Buchungen : public Node {
private:
	double Betrag;
	int Menge;
	string* BuchText;
	string* KontoText;

public:
	Buchungen(void);
	~Buchungen(void);

	void setBetrag(double b);
	void setMenge(int m);
	void setBuchText(string* bt);
	void setKontoText(string* kt);

	double getBetrag(void);
	int getMenge(void);
	string* getBuchText(void);
	string* getKontoText(void);

	int compareToBetrag(Buchungen* c);
	int compareToMenge(Buchungen* c);
	int compareToBuchText(Buchungen* c);
	int compareToKontoText(Buchungen* c);
};
#endif /*BUCHUNGEN_H_*/
</code></pre>
<p>vielen dank,<br />
sjoe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1182054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1182054</guid><dc:creator><![CDATA[sjoe]]></dc:creator><pubDate>Mon, 27 Nov 2006 08:24:04 GMT</pubDate></item><item><title><![CDATA[Reply to templates und pointer on Mon, 27 Nov 2006 08:41:42 GMT]]></title><description><![CDATA[<p>Die Klasse 'List' ist eine Template-Klasse, da mußt du die Implemntierung der Methoden direkt vor Ort vornehmen, damit der Compiler sie wiederfindet (wenn du das in eine eigene .CPP auslagerst, weiß der Compiler nicht, was für List&lt;&gt; Spezialisierungen benötigt werden).</p>
<p>Übrigens: Wenn du mit Templates arbeitest, mußt du nicht auf einer vorgegebenen Vererbungshierarchie arbeiten <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="😉"
    /> Du solltest lieber die Node-Klasse auch als Template definieren und deine Datenklasse (Buchungen oder ähnliches) dort reinkapseln:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class Node
{
  T data;
  Node* next;
  ...
};

template&lt;typename T&gt;
class List
{
  Node&lt;T&gt;* first;
  Node&lt;T&gt;* next;
  ...
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1182065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1182065</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 27 Nov 2006 08:41:42 GMT</pubDate></item><item><title><![CDATA[Reply to templates und pointer on Mon, 27 Nov 2006 13:20:36 GMT]]></title><description><![CDATA[<p>vielen dank für die antwort,<br />
auf sowas kommt man ja nie.</p>
<p>mfg sjoe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1182299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1182299</guid><dc:creator><![CDATA[sjoe]]></dc:creator><pubDate>Mon, 27 Nov 2006 13:20:36 GMT</pubDate></item><item><title><![CDATA[Reply to templates und pointer on Tue, 28 Nov 2006 11:44:16 GMT]]></title><description><![CDATA[<p>eine kleine nachfrage zu den templates.<br />
wie kann ich die templatisierte klasse list in node als friend setzen?</p>
<p>&quot;friend class List&lt;T&gt;;&quot; geht leider nicht.</p>
<p>geht das überhaupt nicht oder gibt es dafür irgendwelche kniffe?</p>
<p>mfg sjoe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1182968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1182968</guid><dc:creator><![CDATA[sjoe]]></dc:creator><pubDate>Tue, 28 Nov 2006 11:44:16 GMT</pubDate></item><item><title><![CDATA[Reply to templates und pointer on Tue, 28 Nov 2006 11:54:43 GMT]]></title><description><![CDATA[<p>Schau doch mal hier rein<br />
<a href="http://www.ica1.uni-stuttgart.de/Courses_and_Lectures/C++/script/node23.html#SECTION00531000000000000000" rel="nofollow">http://www.ica1.uni-stuttgart.de/Courses_and_Lectures/C++/script/node23.html#SECTION00531000000000000000</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1182972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1182972</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 28 Nov 2006 11:54:43 GMT</pubDate></item><item><title><![CDATA[Reply to templates und pointer on Tue, 28 Nov 2006 11:57:50 GMT]]></title><description><![CDATA[<p>Da benötigst du afaik eine Forward-Deklaration, damit der Compiler das Template richtig zuordnen kann:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; class List;

template&lt;typename T&gt;
class Node
{
  friend class List&lt;T&gt;;
  ...
};

template&lt;typename T&gt;
class List
{
  ...
};
</code></pre>
<p>evt. ist es für die Datenkapselung sogar günstiger, die Node-Klasse <em>in</em> der List zu definieren:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class List
{
private:
  struct Node
  {
    ...
  };
  ...
};
</code></pre>
<p>PS: Wenn du dir Arbeit sparen willst, kannst du auch std::list verwenden <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="😉"
    /> Das ist fertig und kann auch recht flexibel eingesetzt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1182975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1182975</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 28 Nov 2006 11:57:50 GMT</pubDate></item></channel></rss>