<?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[Rückgabewerte bei Schnittstellen erweitern]]></title><description><![CDATA[<p>Hallo Community!</p>
<p>Ich habe die letzten 6 Jahre in PHP entwickelt und möchte nun meinen Horizont erweitern um C++. Aufgrund der schwachen Typisierung von PHP ist es möglich, unterschiedliche Datentypen von einer Methode wiederzugeben. In der Vererbung ist dies recht praktisch doch C++ bietet so etwas in dem Sinne nicht dank der starken Typisierung. Soweit so gut, so weit so fein. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Eine Möglichkeit bieten hier Templates und genau bei diesen bin ich jetzt auf zwei Verständnisprobleme gestoßen, bei dem ich hoffe, dass mir diese einer erläutern kann.</p>
<p>Als ein Beispiel habe ich mir mal ein kleines Testprogramm geschrieben, bei dem ich ein Iterator Aggregate Design Pattern implementiert habe, wie es in PHP an vielen Stellen benutzt wird. Ich weiß, C++ hat ein viel besseres Iterator Design implementiert, aber für mein Verständnis ist dieses PHP- und Java-like erst einmal besser. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>So hier der Code und danach meinen Problemen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

// ---------------------------------------------------------------------------
// Abstraktion
// ---------------------------------------------------------------------------
template&lt;typename T&gt; 
class IteratorInterface
{
public:
	virtual T* current(void) = 0;
	virtual unsigned long key(void) const = 0;
	virtual void next(void) = 0;
	virtual void rewind(void) = 0;
	virtual bool valid(void) const = 0;
};

template&lt;typename T&gt; 
class IteratorAggregateInterface
{
public:
	virtual IteratorInterface&lt;T&gt;* iterator(void) = 0;
};

// ---------------------------------------------------------------------------
// Konkretisierung
// ---------------------------------------------------------------------------
class Stack : 
    public IteratorAggregateInterface&lt;unsigned long&gt;
{
	friend class StackIterator;

private:
	unsigned long data[10];
	unsigned long index;

public:
	Stack(void) : index(0) 
    {
        std::memset(data, 0, sizeof(data));
    }

	const Stack&amp; push(const unsigned long&amp; value)
	{
		data[index++] = value;
		return *this;
	}

	// StackIterator* iterator(void); // Fehler/Frage 1
	IteratorInterface&lt;unsigned long&gt;* iterator(void);
};

class StackIterator : 
    public IteratorInterface&lt;unsigned long&gt;
{
private:
	Stack* stack;
	unsigned long index;

public:
	StackIterator(Stack* stack) : 
		index(0), 
		stack(stack) 
	{
	}

	unsigned long* current(void)	{ return &amp;stack-&gt;data[index]; }
	unsigned long key(void) const	{ return index; }
	void next(void)					{ ++index; }
	void rewind(void)				{ index = 0; }
	bool valid(void) const			{ return index &lt; stack-&gt;index; }
};

// StackIterator* Stack::iterator(void) // Fehler/Frage 1
IteratorInterface&lt;unsigned long&gt;* Stack::iterator(void)
{
	return new StackIterator(this);
}

// ---------------------------------------------------------------------------
// Testprogramm
// ---------------------------------------------------------------------------
int main(void)
{
	Stack stack;

	stack.push(2);
	stack.push(3);
	stack.push(4);
	stack.push(5);

	// StackIterator* i = stack.iterator();	// Fehler/Frage 2
	IteratorInterface&lt;unsigned long&gt;* i = stack.iterator();

	for (i-&gt;rewind(); i-&gt;valid(); i-&gt;next())
	{
		std::cout &lt;&lt; (*i-&gt;current()) &lt;&lt; std::endl;
	}

	delete i;
}
</code></pre>
<p>Wie man hier sehen kann habe ich ein abstraktes Iterator Aggregate Design Pattern implementiert, welches ich als einheitliche Schnittstelle für Iteratoren und Iterator Aggregates verwenden möchte. Gefolgt wird dies von einer Konkretisierung der Schnittstelle, in dem ich einen Stack implementiert habe mit einem dazugehörigen Iterator.</p>
<p><strong>Zu meinem Punkt &quot;Fehler/Frage 1&quot;</strong><br />
In der Klasse IteratorAggregate ist iterator() mit dem Rückgabetyp &quot;IteratorInterface&lt;T&gt;<em>&quot; definiert. Wenn ich nun in der Konkretisierung als Rückgabewert &quot;StackIterator</em>&quot; definiere bekomme ich diesen Kompilierfehler:<br />
&quot;error C2555: 'Stack::iterator': overriding virtual function return type differs and is not covariant from 'IteratorAggregateInterface&lt;T&gt;::iterator'&quot;</p>
<p>Dies hat denke ich damit zu tun, dass die Schnittstellendefintion überschrieben wurde. Was ich jetzt nicht verstehe ist, dass IteratorIterface eine Untermenge von StackIterator ist und diese Definition eigentlich nur erweitert wurde und IteratorInterface also beinhaltet. Dadurch sollte diese &quot;Erweiterung&quot; doch eigentlich möglich sein? Gibt es hierfür in C++ eine Implementationsmöglichkeit?</p>
<p><strong>Zu meinem Punkt &quot;Fehler/Frage 2&quot;</strong><br />
Eigentlich hängt dieser genau wie Punkt 1 zusammen. Wenn ich &quot;IteratorInterface&lt;unsigned long&gt;<em>&quot; in &quot;StackIterator</em>&quot; ersetze, erlange ich natürlich einen Compiler-Fehler, da StackIterator eine höhere Vererbungsebene hat als IteratorInterface und nur durch Up-Casting erreicht werden kann.</p>
<p>Meine Hauptfrage bei diesem Beispiel ist, wie kann ich die Konkretisierung auch auf die Rückgabewerte ausweiten, dass ich in einer konkreten Implementierung, in der main-Funktion folgendes Schreiben kann:</p>
<pre><code class="language-cpp">// [...]
StackIterator* i = stack.iterator();
// [...]
</code></pre>
<p>Ist so etwas überhaupt in C++ möglich?</p>
<p>Wenn jemand zum Code Anregungen, Kritik oder Erweiterungspotential sieht bitte sagen. Wie schon gesagt, ich weiß das C++ bessere Iterator-Implementierungen besitzt, aber es handelt sich hier <strong>ausschließlich</strong> um ein Stück Lern-Code. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Vielen Dank schon einmal im voraus und einen schönen Abend noch,<br />
Martin <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/308027/rückgabewerte-bei-schnittstellen-erweitern</link><generator>RSS for Node</generator><lastBuildDate>Tue, 04 Aug 2026 05:35:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/308027.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 12 Sep 2012 18:51:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Rückgabewerte bei Schnittstellen erweitern on Wed, 12 Sep 2012 18:51:18 GMT]]></title><description><![CDATA[<p>Hallo Community!</p>
<p>Ich habe die letzten 6 Jahre in PHP entwickelt und möchte nun meinen Horizont erweitern um C++. Aufgrund der schwachen Typisierung von PHP ist es möglich, unterschiedliche Datentypen von einer Methode wiederzugeben. In der Vererbung ist dies recht praktisch doch C++ bietet so etwas in dem Sinne nicht dank der starken Typisierung. Soweit so gut, so weit so fein. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Eine Möglichkeit bieten hier Templates und genau bei diesen bin ich jetzt auf zwei Verständnisprobleme gestoßen, bei dem ich hoffe, dass mir diese einer erläutern kann.</p>
<p>Als ein Beispiel habe ich mir mal ein kleines Testprogramm geschrieben, bei dem ich ein Iterator Aggregate Design Pattern implementiert habe, wie es in PHP an vielen Stellen benutzt wird. Ich weiß, C++ hat ein viel besseres Iterator Design implementiert, aber für mein Verständnis ist dieses PHP- und Java-like erst einmal besser. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>So hier der Code und danach meinen Problemen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

// ---------------------------------------------------------------------------
// Abstraktion
// ---------------------------------------------------------------------------
template&lt;typename T&gt; 
class IteratorInterface
{
public:
	virtual T* current(void) = 0;
	virtual unsigned long key(void) const = 0;
	virtual void next(void) = 0;
	virtual void rewind(void) = 0;
	virtual bool valid(void) const = 0;
};

template&lt;typename T&gt; 
class IteratorAggregateInterface
{
public:
	virtual IteratorInterface&lt;T&gt;* iterator(void) = 0;
};

// ---------------------------------------------------------------------------
// Konkretisierung
// ---------------------------------------------------------------------------
class Stack : 
    public IteratorAggregateInterface&lt;unsigned long&gt;
{
	friend class StackIterator;

private:
	unsigned long data[10];
	unsigned long index;

public:
	Stack(void) : index(0) 
    {
        std::memset(data, 0, sizeof(data));
    }

	const Stack&amp; push(const unsigned long&amp; value)
	{
		data[index++] = value;
		return *this;
	}

	// StackIterator* iterator(void); // Fehler/Frage 1
	IteratorInterface&lt;unsigned long&gt;* iterator(void);
};

class StackIterator : 
    public IteratorInterface&lt;unsigned long&gt;
{
private:
	Stack* stack;
	unsigned long index;

public:
	StackIterator(Stack* stack) : 
		index(0), 
		stack(stack) 
	{
	}

	unsigned long* current(void)	{ return &amp;stack-&gt;data[index]; }
	unsigned long key(void) const	{ return index; }
	void next(void)					{ ++index; }
	void rewind(void)				{ index = 0; }
	bool valid(void) const			{ return index &lt; stack-&gt;index; }
};

// StackIterator* Stack::iterator(void) // Fehler/Frage 1
IteratorInterface&lt;unsigned long&gt;* Stack::iterator(void)
{
	return new StackIterator(this);
}

// ---------------------------------------------------------------------------
// Testprogramm
// ---------------------------------------------------------------------------
int main(void)
{
	Stack stack;

	stack.push(2);
	stack.push(3);
	stack.push(4);
	stack.push(5);

	// StackIterator* i = stack.iterator();	// Fehler/Frage 2
	IteratorInterface&lt;unsigned long&gt;* i = stack.iterator();

	for (i-&gt;rewind(); i-&gt;valid(); i-&gt;next())
	{
		std::cout &lt;&lt; (*i-&gt;current()) &lt;&lt; std::endl;
	}

	delete i;
}
</code></pre>
<p>Wie man hier sehen kann habe ich ein abstraktes Iterator Aggregate Design Pattern implementiert, welches ich als einheitliche Schnittstelle für Iteratoren und Iterator Aggregates verwenden möchte. Gefolgt wird dies von einer Konkretisierung der Schnittstelle, in dem ich einen Stack implementiert habe mit einem dazugehörigen Iterator.</p>
<p><strong>Zu meinem Punkt &quot;Fehler/Frage 1&quot;</strong><br />
In der Klasse IteratorAggregate ist iterator() mit dem Rückgabetyp &quot;IteratorInterface&lt;T&gt;<em>&quot; definiert. Wenn ich nun in der Konkretisierung als Rückgabewert &quot;StackIterator</em>&quot; definiere bekomme ich diesen Kompilierfehler:<br />
&quot;error C2555: 'Stack::iterator': overriding virtual function return type differs and is not covariant from 'IteratorAggregateInterface&lt;T&gt;::iterator'&quot;</p>
<p>Dies hat denke ich damit zu tun, dass die Schnittstellendefintion überschrieben wurde. Was ich jetzt nicht verstehe ist, dass IteratorIterface eine Untermenge von StackIterator ist und diese Definition eigentlich nur erweitert wurde und IteratorInterface also beinhaltet. Dadurch sollte diese &quot;Erweiterung&quot; doch eigentlich möglich sein? Gibt es hierfür in C++ eine Implementationsmöglichkeit?</p>
<p><strong>Zu meinem Punkt &quot;Fehler/Frage 2&quot;</strong><br />
Eigentlich hängt dieser genau wie Punkt 1 zusammen. Wenn ich &quot;IteratorInterface&lt;unsigned long&gt;<em>&quot; in &quot;StackIterator</em>&quot; ersetze, erlange ich natürlich einen Compiler-Fehler, da StackIterator eine höhere Vererbungsebene hat als IteratorInterface und nur durch Up-Casting erreicht werden kann.</p>
<p>Meine Hauptfrage bei diesem Beispiel ist, wie kann ich die Konkretisierung auch auf die Rückgabewerte ausweiten, dass ich in einer konkreten Implementierung, in der main-Funktion folgendes Schreiben kann:</p>
<pre><code class="language-cpp">// [...]
StackIterator* i = stack.iterator();
// [...]
</code></pre>
<p>Ist so etwas überhaupt in C++ möglich?</p>
<p>Wenn jemand zum Code Anregungen, Kritik oder Erweiterungspotential sieht bitte sagen. Wie schon gesagt, ich weiß das C++ bessere Iterator-Implementierungen besitzt, aber es handelt sich hier <strong>ausschließlich</strong> um ein Stück Lern-Code. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Vielen Dank schon einmal im voraus und einen schönen Abend noch,<br />
Martin <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250745</guid><dc:creator><![CDATA[Php-Martin]]></dc:creator><pubDate>Wed, 12 Sep 2012 18:51:18 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte bei Schnittstellen erweitern on Wed, 12 Sep 2012 19:08:33 GMT]]></title><description><![CDATA[<p>Php-Martin schrieb:</p>
<blockquote>
<p><strong>Zu meinem Punkt &quot;Fehler/Frage 1&quot;</strong><br />
In der Klasse IteratorAggregate ist iterator() mit dem Rückgabetyp &quot;IteratorInterface&lt;T&gt;<em>&quot; definiert. Wenn ich nun in der Konkretisierung als Rückgabewert &quot;StackIterator</em>&quot; definiere bekomme ich diesen Kompilierfehler:<br />
&quot;error C2555: 'Stack::iterator': overriding virtual function return type differs and is not covariant from 'IteratorAggregateInterface&lt;T&gt;::iterator'&quot;</p>
<p>Dies hat denke ich damit zu tun, dass die Schnittstellendefintion überschrieben wurde. Was ich jetzt nicht verstehe ist, dass IteratorIterface eine Untermenge von StackIterator ist und diese Definition eigentlich nur erweitert wurde und IteratorInterface also beinhaltet. Dadurch sollte diese &quot;Erweiterung&quot; doch eigentlich möglich sein? Gibt es hierfür in C++ eine Implementationsmöglichkeit?</p>
</blockquote>
<p>Die Klasse die per Zeiger oder Referenz zurückgegeben wird, muss bereits bei der Deklaration der überschriebenden Funktion vollständig definiert sein (oder aber es ist die Klasse, die gerade definiert wird).</p>
<p>StackIterator ist an der Stelle, an der die Funktion erstmals in Stack deklariert wird selbst noch unvollständig.<br />
Die Klassendefinition von StackIterator muss vor der Definition von Stack stehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250748</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 12 Sep 2012 19:08:33 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte bei Schnittstellen erweitern on Wed, 12 Sep 2012 19:16:53 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a><br />
Ich habe auch schon an eine Forward-Deklaration gedacht, wenn ich diesen Code dann darauf anpasse, also wie folgt erhalte ich ebenfalls einen Compiler-Fehler:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

// ---------------------------------------------------------------------------
// Abstraktion
// ---------------------------------------------------------------------------
template&lt;typename T&gt; 
class IteratorInterface
{
public:
	virtual T* current(void) = 0;
	virtual unsigned long key(void) const = 0;
	virtual void next(void) = 0;
	virtual void rewind(void) = 0;
	virtual bool valid(void) const = 0;
};

template&lt;typename T&gt; 
class IteratorAggregateInterface
{
public:
	virtual IteratorInterface&lt;T&gt;* iterator(void) = 0;
};

// ---------------------------------------------------------------------------
// Konkretisierung
// ---------------------------------------------------------------------------
class StackIterator;
class Stack : 
    public IteratorAggregateInterface&lt;unsigned long&gt;
{
	friend class StackIterator;

private:
	unsigned long data[10];
	unsigned long index;

public:
	Stack(void) : index(0) 
    {
        std::memset(data, 0, sizeof(data));
    }

	const Stack&amp; push(const unsigned long&amp; value)
	{
		data[index++] = value;
		return *this;
	}

	 StackIterator* iterator(void); // Fehler/Frage 1
	//IteratorInterface&lt;unsigned long&gt;* iterator(void);
};

class StackIterator : 
    public IteratorInterface&lt;unsigned long&gt;
{
private:
	Stack* stack;
	unsigned long index;

public:
	StackIterator(Stack* stack) : 
		index(0), 
		stack(stack) 
	{
	}

	unsigned long* current(void)	{ return &amp;stack-&gt;data[index]; }
	unsigned long key(void) const	{ return index; }
	void next(void)					{ ++index; }
	void rewind(void)				{ index = 0; }
	bool valid(void) const			{ return index &lt; stack-&gt;index; }
};

StackIterator* Stack::iterator(void) // Fehler/Frage 1
{
	return new StackIterator(this);
}

// ---------------------------------------------------------------------------
// Testprogramm
// ---------------------------------------------------------------------------
int main(void)
{
	Stack stack;

	stack.push(2);
	stack.push(3);
	stack.push(4);
	stack.push(5);

	// StackIterator* i = stack.iterator();	// Fehler/Frage 2
	IteratorInterface&lt;unsigned long&gt;* i = stack.iterator();

	for (i-&gt;rewind(); i-&gt;valid(); i-&gt;next())
	{
		std::cout &lt;&lt; (*i-&gt;current()) &lt;&lt; std::endl;
	}

	delete i;

	std::cin.get();
}
</code></pre>
<p>Und mein Fehler:<br />
error C2555: 'Stack::iterator': overriding virtual function return type differs and is not covariant from 'IteratorAggregateInterface&lt;T&gt;::iterator'</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250749</guid><dc:creator><![CDATA[Php-Martin]]></dc:creator><pubDate>Wed, 12 Sep 2012 19:16:53 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte bei Schnittstellen erweitern on Wed, 12 Sep 2012 19:24:58 GMT]]></title><description><![CDATA[<p>Php-Martin schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a><br />
Ich habe auch schon an eine Forward-Deklaration gedacht,</p>
</blockquote>
<p>Ein bloße Klassen-<em>Deklaration</em> ist keine <em>Definition</em>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250751</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250751</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 12 Sep 2012 19:24:58 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte bei Schnittstellen erweitern on Wed, 12 Sep 2012 19:39:33 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a><br />
Ich habe die Implementierung jetzt alle Unterhalb der Klassendefinitionen geschrieben. Jetzt kann ich Problemlos kompilieren und es läuft perfekt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Vielen Dank für deine Hilfe, wenn man von PHP kommt ist das doch noch eine starke Umgewöhnung <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>
<p>Hast du vielleicht noch 2-3 Tipps für das Iterator Aggregate Design Pattern was ich hier implementiert habe oder wäre das so im grünen Bereich? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250758</guid><dc:creator><![CDATA[Php-Martin]]></dc:creator><pubDate>Wed, 12 Sep 2012 19:39:33 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte bei Schnittstellen erweitern on Wed, 12 Sep 2012 20:01:32 GMT]]></title><description><![CDATA[<p>Php-Martin schrieb:</p>
<blockquote>
<p>Hast du vielleicht noch 2-3 Tipps für das Iterator Aggregate Design Pattern</p>
</blockquote>
<p>Eigentlich nur 1: vergiss das Pattern.<br />
(Laufzeit-)Polymorphie und Wertsemantik sind in C++ keine orthogonalen Konzepte; willst du beides gleichzeitig haben, wird immer ein Proxy oder etwas ähnliches benötigt.<br />
Da man bei Objekten wie Iteratoren i.d.R. auf Wertsemantik nicht verzichten kann, muss die Polymorphie weichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250764</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 12 Sep 2012 20:01:32 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte bei Schnittstellen erweitern on Wed, 12 Sep 2012 21:00:38 GMT]]></title><description><![CDATA[<p>@ camper<br />
Also im Endeffekt mehr auf die C++ Iterator Pattern konzentrieren. Gibt es dafür irgendwelche Tutorials, wie diese aufgebaut sind in der Implementierung (also nicht in der Verwendung.)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2250777</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2250777</guid><dc:creator><![CDATA[Php-Martin]]></dc:creator><pubDate>Wed, 12 Sep 2012 21:00:38 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte bei Schnittstellen erweitern on Sun, 25 Nov 2012 17:29:31 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Php-Martin schrieb:</p>
<blockquote>
<p>Hast du vielleicht noch 2-3 Tipps für das Iterator Aggregate Design Pattern</p>
</blockquote>
<p>Eigentlich nur 1: vergiss das Pattern.<br />
(Laufzeit-)Polymorphie und Wertsemantik sind in C++ keine orthogonalen Konzepte; willst du beides gleichzeitig haben, wird immer ein Proxy oder etwas ähnliches benötigt.<br />
Da man bei Objekten wie Iteratoren i.d.R. auf Wertsemantik nicht verzichten kann, muss die Polymorphie weichen.</p>
</blockquote>
<p>Hi,</p>
<p>ich habe gerade diesen (für mich) sehr interessanten Topic gefunden, zu dem ich 2-3 Fragen habe:</p>
<p>1. Die Aussage, dass &quot;Laufzeit-/Polymorphie und Wertsematik keine orthogonalen Konzepte in C++&quot; sind verstehe ich nicht so richtig. Was ist hiermit im Detail gemeint?</p>
<p>2. Warum sollte man grundsätzlich bei C++ auf interne Traversierung setzen und weniger auf externe Iteration? Wegen Gründen der Performace?</p>
<p>3. Ist das hier oben genannte Pattern (welches auch in Java und C# generell eingesetzt wird) grundsätzlich Käse für C++? Mich würde die Begründung dafür interessieren.</p>
<p>Schönes Wochenende noch!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2274562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274562</guid><dc:creator><![CDATA[C&#x2F;C++-Coder]]></dc:creator><pubDate>Sun, 25 Nov 2012 17:29:31 GMT</pubDate></item></channel></rss>