<?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[von std::vector erben??]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich drehe hier langsam am Rad...</p>
<p>Ich hab eine kleine Klasse gebaut die lange funktioniert hat und jetzt auf einmal nichtmehr. Das ist aber nicht ganz das Thema, weil ich wohl irgendwas geändert haben (muss) oder eine neue Compilerversion das anders macht?<br />
Wie auch immer, es geht um folgendes:</p>
<p>Ich möchte eine konkretisierte vector klasse für char-arrays.</p>
<p>Habe meinen Code mal in der folgenden Minimalversion nachgestellt:</p>
<pre><code>class Arr : public std::vector&lt;char*&gt;
{
	public:
	explicit Arr() : std::vector&lt;char*&gt;()
	{
	}
};

int main()
{
Arr ar;
std::vector&lt;char *&gt; vAr;
return 0;
}
</code></pre>
<p>Ein Breakpoint nach beiden Objektinitialisierungen im Debugger mit folgenden Outputs von [Objekt].size();</p>
<p>ar.size() = 3958981726<br />
vAr.size() = 0</p>
<p>Objekt ar ist natürlich nicht wirklich funktionsfähig... aber warum?</p>
<p>Steh wohl echt aufm Schlauch ...</p>
<p>Danke für Hilfe!</p>
<p>mfg jghj</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/203196/von-std-vector-erben</link><generator>RSS for Node</generator><lastBuildDate>Wed, 07 Oct 2026 11:00:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/203196.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 20 Jan 2008 00:15:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 00:15:16 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich drehe hier langsam am Rad...</p>
<p>Ich hab eine kleine Klasse gebaut die lange funktioniert hat und jetzt auf einmal nichtmehr. Das ist aber nicht ganz das Thema, weil ich wohl irgendwas geändert haben (muss) oder eine neue Compilerversion das anders macht?<br />
Wie auch immer, es geht um folgendes:</p>
<p>Ich möchte eine konkretisierte vector klasse für char-arrays.</p>
<p>Habe meinen Code mal in der folgenden Minimalversion nachgestellt:</p>
<pre><code>class Arr : public std::vector&lt;char*&gt;
{
	public:
	explicit Arr() : std::vector&lt;char*&gt;()
	{
	}
};

int main()
{
Arr ar;
std::vector&lt;char *&gt; vAr;
return 0;
}
</code></pre>
<p>Ein Breakpoint nach beiden Objektinitialisierungen im Debugger mit folgenden Outputs von [Objekt].size();</p>
<p>ar.size() = 3958981726<br />
vAr.size() = 0</p>
<p>Objekt ar ist natürlich nicht wirklich funktionsfähig... aber warum?</p>
<p>Steh wohl echt aufm Schlauch ...</p>
<p>Danke für Hilfe!</p>
<p>mfg jghj</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439723</guid><dc:creator><![CDATA[jghj]]></dc:creator><pubDate>Sun, 20 Jan 2008 00:15:16 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 00:29:43 GMT]]></title><description><![CDATA[<p>jghj schrieb:</p>
<blockquote>
<p>Ich möchte eine konkretisierte vector klasse für char-arrays.</p>
</blockquote>
<p>Grundsätzlich sollte man nicht von den STL-Klassen erben. Ich weiß nicht ob das überhaupt vorgesehen ist (bei std::string ist dem definitiv nicht so; die Klasse besitzt z.B. keinen virtuellen Destruktor). Davon ganz abgesehen... Wozu?</p>
<p>Eine Alternative zur Vererbung wäre natürlich noch Komposition.</p>
<p>Was benötigst du was du nicht durch std::vector&lt;char*&gt; oder besser std::vector<a href="std::string" rel="nofollow">std::string</a> gegeben hast?</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439732</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Sun, 20 Jan 2008 00:29:43 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 00:43:14 GMT]]></title><description><![CDATA[<p>Ich habe deinen Code mal durch PC-Lint gejagt, und dabei kam das heraus was ich dachte:</p>
<p>Warnung - base class destructor for class 'vector' is not virtual<br />
-- Effective C++ #14 &amp; Eff. C++ 3rd. item 7<br />
Effective Note - Base class 'std::vector&lt;char *&gt;' is not abstract<br />
-- More Effective C++ #33</p>
<p>cu André<br />
P.S: Wobei es bei mir auch keinen Fehler erzeugt (MSVC2005)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439735</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439735</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Sun, 20 Jan 2008 00:43:14 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 00:50:54 GMT]]></title><description><![CDATA[<p>Ich möchte halt einfach den vector um ein paar für mich brauchbare Methoden ergänzen.</p>
<p>Man sollte grundsätzlich nicht von Ihnen erben ... die Frage die sich mir stellt ist, warum die in der Klassendeklaration viel Code als protected markieren? Oder das dann eben nur für Interne Vererbungen?</p>
<p>Komposition wäre natürlich eine Möglichkeit, aber dann muss ich halt alle verfügbaren mir wichtigen methoden anlegen und weiterwrappen.... Da wäre mir eine Vererbung schon etwas lieber.</p>
<p>Das mit dem virtuellen Konstruktor ist natürlich ein Argument ...</p>
<p>Aber warum ging das jetzt erstmal die ganze letzte Zeit? Und nur wegen dem Destruktor wird doch die size() nichts falsches zurückgeben (erstmal bin ich ja beim erstellen des Objektes)</p>
<p>Komisch ist das Ganze...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439737</guid><dc:creator><![CDATA[jghj]]></dc:creator><pubDate>Sun, 20 Jan 2008 00:50:54 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 09:19:13 GMT]]></title><description><![CDATA[<p>Daran ist nichts komisch. Wenn eine Klasse keinen virtuellen Dtor hat, ist sie nicht für Vererbung vorgesehen/bestimmt. Ist doch eine ganz einfache Definition?! Eine Klasse die nicht vererbar ist, hat ja trotzdem seine Daseinsberechtigung.</p>
<p>Wenn du die Vector-Klasse &quot;erweitern&quot; willst, kannst du doch privat &quot;vererben&quot; und mit using die Methoden sichtbar machen:</p>
<pre><code class="language-cpp">class myvector : private std::vector
{
    public:
        using size;
        using push_back;
};
</code></pre>
<p>Dann kann man auch size und push_back aufrufen, ohne das Vererbt wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439772</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439772</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Sun, 20 Jan 2008 09:19:13 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 10:35:59 GMT]]></title><description><![CDATA[<p>Artchi schrieb:</p>
<blockquote>
<p>Daran ist nichts komisch. Wenn eine Klasse keinen virtuellen Dtor hat, ist sie nicht für Vererbung vorgesehen/bestimmt. Ist doch eine ganz einfache Definition?! Eine Klasse die nicht vererbar ist, hat ja trotzdem seine Daseinsberechtigung.</p>
</blockquote>
<p>Das habe ich nicht angezweifelt.<br />
Ich denke du meinst meine Phrase über die protected Sections...protected kommt ja wirklich nur bei Vererbung zum tragen?<br />
Oder war das evtl &quot;Gewohnheit&quot; des Entwicklers ... oder um sich die Option für später mal offen zu halten? Aber son &quot;virtual&quot; vorm destructor wäre ja dann auch kein Problem gewesen <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>Wenn ich hier jedoch diese &quot;virtual&quot;-Theorie mal runterprogrammiere mit dem g++ 4.0.3 interessiert ihn das wenig.</p>
<p>Ich kann nicht-virtual methoden überschreiben, ohne dass die der Basisklasse stattdessen genutzt werden. Genauso werden auch beide Destruktoren nacheinander aufgerufen, trotz nicht-virtual.</p>
<p>Was das Ganze noch komischer macht, warum das dann bei vector nicht geht <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1439804</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439804</guid><dc:creator><![CDATA[jghj]]></dc:creator><pubDate>Sun, 20 Jan 2008 10:35:59 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 11:07:56 GMT]]></title><description><![CDATA[<p>In vielen Situationen funktioniert das mit der geerbten Klasse dann ganz gut, nur bei sowas nicht:</p>
<pre><code class="language-cpp">vector&lt;char*&gt; *ptr = new myvector();
delete ptr;
</code></pre>
<p>Hier wird dann nur der Destruktor vom std-vector aufgerufen, weil er eben nicht virtual ist.</p>
<p>Hast du denn noch zusätzliche Member-Variablen in deiner von vector erbenden Klasse?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439816</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sun, 20 Jan 2008 11:07:56 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 11:10:17 GMT]]></title><description><![CDATA[<p>Artchi! dein Code funktioniert nicht!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439818</guid><dc:creator><![CDATA[Bademeister]]></dc:creator><pubDate>Sun, 20 Jan 2008 11:10:17 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 11:29:31 GMT]]></title><description><![CDATA[<p>Bademeister schrieb:</p>
<blockquote>
<p>Artchi! dein Code funktioniert nicht!</p>
</blockquote>
<p>Den Template-Parameter wirst du ja wohl noch selber setzen können, oder? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439826</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Sun, 20 Jan 2008 11:29:31 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 11:36:05 GMT]]></title><description><![CDATA[<p>jghj schrieb:</p>
<blockquote>
<p>Ich denke du meinst meine Phrase über die protected Sections...protected kommt ja wirklich nur bei Vererbung zum tragen?<br />
Oder war das evtl &quot;Gewohnheit&quot; des Entwicklers ... oder um sich die Option für später mal offen zu halten?</p>
</blockquote>
<p>Warum der Implementierer protected-Methoden verwendet, wird sein Geheimnis bleiben. Kannst ihn ja aber gerne fragen. Implementierungsdetails sind aber irrelevant. Entscheidend ist der Standard-Vector und wie er in der ISO-Norm definiert wurde. Da steht nichts von virtuellem Dtor und es werden meines Wissens auch nur public-Methoden dort beschrieben.</p>
<p>Nur weil in der GCC-Vector protected Methoden benutzt werden, muß das nicht auf den Dinkumware-Vector zu treffen. Und es gibt noch mehr Implementierungen auf diesem Planeten.</p>
<p>Wenn irgendwas unter GCC oder einem anderen Compiler unerwartet funktioniert, muß es auf einem anderen Compiler nicht auch so kommen. Es wäre natürlich wünschenswert wenn sich alle Implementierungen gleich verhalten. Ist aber nicht immer.</p>
<p>Ich habe jedenfalls mal in einer meiner Basis-Klassen ausversehen virtual vergessen und es hat sich in einer späteren Situation ausgewirkt... ähnlich dem Beispiel von Badestrand. Vorher ist es mir nicht aufgefallen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439828</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Sun, 20 Jan 2008 11:36:05 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 11:55:41 GMT]]></title><description><![CDATA[<p>Artchi schrieb:</p>
<blockquote>
<p>Bademeister schrieb:</p>
<blockquote>
<p>Artchi! dein Code funktioniert nicht!</p>
</blockquote>
<p>Den Template-Parameter wirst du ja wohl noch selber setzen können, oder? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>Ja aber auch dann geht es nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439835</guid><dc:creator><![CDATA[Bademeister]]></dc:creator><pubDate>Sun, 20 Jan 2008 11:55:41 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 11:57:47 GMT]]></title><description><![CDATA[<pre><code>error C2873: 'size' : symbol cannot be used in a using-declaration
error C2873: 'push_back' : symbol cannot be used in a using-declaration
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1439837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439837</guid><dc:creator><![CDATA[Bademeister]]></dc:creator><pubDate>Sun, 20 Jan 2008 11:57:47 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 12:09:28 GMT]]></title><description><![CDATA[<p>Ohne code natürlich sehr aussagekräftig...<br />
Ich hab private-Vererbung in letzter Zeit auch des öfteren gebraucht</p>
<pre><code class="language-cpp">typedef  std::vector&lt; std::pair&lt;Value,Value&gt; &gt; SolveContainer;
class SolveModule : public Module , private  SolveContainer {

        public:
        using  SolveContainer::operator[];
        using  SolveContainer::size;
        using  SolveContainer::push_back;
...
</code></pre>
<p>Schreibe deine Klasse analog dazu, dann sollte es gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439841</guid><dc:creator><![CDATA[Mario Sandler]]></dc:creator><pubDate>Sun, 20 Jan 2008 12:09:28 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 12:17:06 GMT]]></title><description><![CDATA[<p>Ja nur weil ichs public nich erben kann wirds im private nicht mehr Sinn machen <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>Mit dem virtual verhält es sich doch so, dass der Destruktor bzw. Methoden, die durch eine Subklasse neu implementiert wurde, in jedem Fall augerufen wird.</p>
<p>Unabhängig von einem Upcast.</p>
<p>Wurde diese Klasse jedoch nicht ge&quot;upcasted&quot; so macht es doch garkeinen Unterschied ob virtual oder nicht, da das Objekt die Informationen über sich selbst ja kennt.</p>
<p>Beim erstellen der Subklasse wird erst der Konstruktor der Basisklasse aufgerufen um das Objekt zu erzeugen, danach der eigene. Beim Zerstören des Objektes wird erst der eigene Destruktor aufgerufen und erst dann die aller Superklassen.</p>
<p>Also warum laufe ich in Probleme wenn ich nie eine Zweideutigkeit (vorallem nicht in dem kleinen Beispiel) provoziere?</p>
<p>Versteht mich bitte nicht falsch, ich will diese Lösung nicht auf Teufel komm raus durchsetzen. Aber ich würde schon gerne wissen, warum ich es anders machen sollte weil sich das nicht mit der Theorie (zumindest mit meiner ;)) deckt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439849</guid><dc:creator><![CDATA[jghj]]></dc:creator><pubDate>Sun, 20 Jan 2008 12:17:06 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 12:31:57 GMT]]></title><description><![CDATA[<p>jghj schrieb:</p>
<blockquote>
<p>Ich möchte halt einfach den vector um ein paar für mich brauchbare Methoden ergänzen.</p>
</blockquote>
<p>Gibt es einen bestimmten Grund warum du auf Teufel komm raus eine Monsterklasse basteln willst, anstelle der offensichtlichen Variante:</p>
<pre><code class="language-cpp">// arr.hpp
typedef std::vector&lt;char*&gt; arr_t;

void foo( arr_t const&amp; self );
void bar( arr_t&amp;       self, /*...*/ );
// ...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1439856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439856</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Sun, 20 Jan 2008 12:31:57 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 12:44:20 GMT]]></title><description><![CDATA[<p>Bademeister schrieb:</p>
<blockquote>
<pre><code>error C2873: 'size' : symbol cannot be used in a using-declaration
error C2873: 'push_back' : symbol cannot be used in a using-declaration
</code></pre>
</blockquote>
<p>Sorry, war halt Pseudocode (genauso wie das fehlende Template), habe den Namensraum vergessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439863</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Sun, 20 Jan 2008 12:44:20 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 12:46:19 GMT]]></title><description><![CDATA[<p>Ich will keine Monsterklasse bauen.</p>
<p>Und ich denke, dass das Objektorientierte design schon seine Daseinsberechtigung hat. Auch wenn nicht möchte ich es in diesem realisieren und meine eigenen Prozeduren als Methoden und nicht als (globale) Funktionen realisieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439866</guid><dc:creator><![CDATA[jghj]]></dc:creator><pubDate>Sun, 20 Jan 2008 12:46:19 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 12:53:06 GMT]]></title><description><![CDATA[<p>jghj schrieb:</p>
<blockquote>
<p>Ja nur weil ichs public nich erben kann wirds im private nicht mehr Sinn machen <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>
</blockquote>
<p>Es hat keiner gesagt, das es eine Vererbung ist. Es ist eine Lösungsvorschlag, den du anscheinend nicht akzeptieren willst. Mehr können wir aber auch nicht für dich tun.</p>
<p>jghj schrieb:</p>
<blockquote>
<p>Beim erstellen der Subklasse wird erst der Konstruktor der Basisklasse aufgerufen um das Objekt zu erzeugen, danach der eigene. Beim Zerstören des Objektes wird erst der eigene Destruktor aufgerufen und erst dann die aller Superklassen.</p>
<p>Also warum laufe ich in Probleme wenn ich nie eine Zweideutigkeit (vorallem nicht in dem kleinen Beispiel) provoziere?</p>
<p>Versteht mich bitte nicht falsch, ich will diese Lösung nicht auf Teufel komm raus durchsetzen. Aber ich würde schon gerne wissen, warum ich es anders machen sollte weil sich das nicht mit der Theorie (zumindest mit meiner ;)) deckt.</p>
</blockquote>
<p>Hem, das Problem ist, das du der Definition ausweichen und nicht akzeptieren willst. Weißt du was du willst? Du willst eine Container-Klasse spezialisieren, obwohl das mit eben DIESEN Container-Klassen nicht möglich ist. Punkt. Warum ist die Banane krumm? Du wirst keine gerade Banane finden, nur weil dir die krummen nicht fallen. Eine Banane ist per Definition krumm. Punkt!</p>
<p>Wenn du von vector erbst, wird dessen Dtor nicht immer aufgerufen und somit der Vector nicht korrekt aufgeräumt. Das wirst auch du nicht ändern können. Man kann jetzt fragen, warum Vector keinen virtuellen Dtor hat. Die Frage ist berechtigt, genauso wie mit der Banane. Aber nur wegen der Frage, wird sich die Definition nicht ändern.</p>
<p>Wenn du Vererbbare Container haben willst, mußt du sie selber (neu) definieren oder im Netz nach entsprechenden suchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439870</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Sun, 20 Jan 2008 12:53:06 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 13:02:08 GMT]]></title><description><![CDATA[<p>jghj schrieb:</p>
<blockquote>
<p>Ich will keine Monsterklasse bauen.</p>
<p>Und ich denke, dass das Objektorientierte design schon seine Daseinsberechtigung hat. Auch wenn nicht möchte ich es in diesem realisieren und meine eigenen Prozeduren als Methoden und nicht als (globale) Funktionen realisieren.</p>
</blockquote>
<p>Die Standard-Bibliothek ist ja auch nicht komplett OO. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> C++ ist eine Multiparadigmen-Sprache, und genau das gleiche spiegelt sich in der Stdlib wieder. Viele Typen (wie die Container oder Strings) machen sich lediglich die Möglichkeit des Datenverstecken zu nutze. Das es keine Vererbung gibt, kommt durch die Templates, die das ausgleichen. Und da spielen sicherlich Performance-Gründe eine wichtige Rolle! Es ist ein Paradigma das nunmal gewählt wurde und den C++-Standard ausmacht. Wenns einem nicht gefällt, kann man eine andere Library benutzen.</p>
<p>Es gibt aber auch Std-Typen (wie die Streams) die vom kompletten OOD Gebrauch machen. Da wird sogar Mehrfachvererbung (iostream) eingesetzt, da hast du sogar das Extrem-OOD! Das ist ein anderes Paradigma, das auch in der Std-Lib existiert.</p>
<p>Wenn man die Std-Lib benutzt, muß man sich auf diese Paradigmen und somit Design-Entscheidungen einlassen. Und wenn man Vector nicht korrekt vererben kann, dann muß man diese Design-Entscheidung akzeptieren oder man lässt diese Klassen links liegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439873</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Sun, 20 Jan 2008 13:02:08 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 13:30:12 GMT]]></title><description><![CDATA[<p>Artchi schrieb:</p>
<blockquote>
<p>jghj schrieb:</p>
<blockquote>
<p>Ja nur weil ichs public nich erben kann wirds im private nicht mehr Sinn machen <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>
</blockquote>
<p>Es hat keiner gesagt, das es eine Vererbung ist. Es ist eine Lösungsvorschlag, den du anscheinend nicht akzeptieren willst. Mehr können wir aber auch nicht für dich tun.</p>
</blockquote>
<pre><code class="language-cpp">class myvector : private std::vector
{
    public:
        using size;
        using push_back;
};
</code></pre>
<p>Dieser code sagt mir, DASS es eine Vererbung ist.</p>
<p>Es ist ein Lösungsvorschlag, der sagt, mach das Gleiche wie ich eh wollte nur definiere mir eben alles als private. Anschließend schalte ich die gebrauchten Methoden wieder frei für den public-Zugriff.</p>
<p>Dieses bringt mir ja keinen Vorteil, da es genau das gleiche Vorgehen wie ich es bereits probiert habe widerspiegelt. (Um meine Aussage zu verifizieren habe ichs zusätzlich auch noch ausprobiert; das Praxisbeispiel bestätigt meine These)</p>
<p>Und wie ich vorher versucht hab zu erklären möchte ich nicht den Standard ändern und will auch nicht unbedingt diese Lösung so durchziehen, da ich über die Komposition eine angebrachte Lösung habe (die mir aber nicht ganz so elegant wie die Vererbung erscheint).</p>
<p>Die Frage, die für mich interessant ist: WARUM geht das nicht? Welche Codefloskel erlaubt mir die Vererbung, ändert aber die Funktionsweise der Superklasse.</p>
<p>Nicht zuletzt interessiert mich das, weil es ja für mich selbst evtl auch mal sinnvoll sein kann, eine Klasse zu erstellen von der nicht geerbt werden darf.</p>
<p>Als Argument fällt für mich jedoch der virtuelle Destruktor heraus, weil der ja bei dem Objekt selbst nicht zum tragen kommt und es schon nach der Initialisierung hängt.</p>
<p>Dass C++ sehr vielseitig usw. ist und auf Altlasten aufbaut ist mir bewusst, jedoch weiß ich nicht warum ich statt einer Komposition oder anderen OO Vorgehensweisen auf einmal zurück zu C soll und mir Hilfsfunktionen anlegen soll?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439891</guid><dc:creator><![CDATA[jghj]]></dc:creator><pubDate>Sun, 20 Jan 2008 13:30:12 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 13:54:42 GMT]]></title><description><![CDATA[<p>Naja, private-Vererbung ist eigentlich keine Vererbung sondern eine Komposition.<br />
D.h. deine Klasse <strong>ist</strong> nacher kein STL-Container, sondern sie <strong>hat</strong> einen STL-Container!<br />
Durch den fehlenden virtuellen Destruktor handelst du dir in diesem Fall nur Probleme ein wenn du die Klasse z.B. über den Zeiger der Basisklasse löschen tust.<br />
Dann wird eben der falsche Destruktor aufgerufen. Darum vermeide das Problem indem du private-Vererbung benutzt und die Schnittstelle gezielt freigibst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439905</guid><dc:creator><![CDATA[Mario Sandler]]></dc:creator><pubDate>Sun, 20 Jan 2008 13:54:42 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 14:00:06 GMT]]></title><description><![CDATA[<p>Okay das habe ich mitgenommen.</p>
<p>Der Wert von size() nach dem Erstellen des Objektes ist aber immernoch sehr hoch und falsch... :|</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439908</guid><dc:creator><![CDATA[jghj]]></dc:creator><pubDate>Sun, 20 Jan 2008 14:00:06 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 14:11:27 GMT]]></title><description><![CDATA[<p>jghj schrieb:</p>
<blockquote>
<p>Ein Breakpoint nach beiden Objektinitialisierungen im Debugger mit folgenden Outputs von [Objekt].size();</p>
<p>ar.size() = 3958981726<br />
vAr.size() = 0</p>
</blockquote>
<p>Ich hab zwar keine Ahnung, was dein Debugger hier anstellt, aber das Ganze ist ohnehin unsinnig. Die size-Memberfunktion muss in deinem Beispiel gar nicht instantiiert werden - der Versuch sie aufzurufen (ist das überhaupt das, was der Debugger dort tut?) daher sinnfrei. Das Verhalten eines Programms ist nicht für Debuggerausgaben definiert worden - wenn die &quot;Größe&quot; des Vektors gar nicht beobachtbar ist, ist die Analyse von Debuggerausgaben sinnlos, wenn du dich nicht von vornherein auf Compilerinterna festlegen willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439912</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 20 Jan 2008 14:11:27 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 14:27:53 GMT]]></title><description><![CDATA[<p>jghj schrieb:</p>
<blockquote>
<p>Dass C++ sehr vielseitig usw. ist und auf Altlasten aufbaut ist mir bewusst, jedoch weiß ich nicht warum ich statt einer Komposition oder anderen OO Vorgehensweisen auf einmal zurück zu C soll und mir Hilfsfunktionen anlegen soll?</p>
</blockquote>
<p>Das ist keine Altlast und das hat *nichts* mit C zu tun. Es ist vielmehr ein anderes Paradigma. OOP ist auch *nicht* das Heilige Gral. Diese Hilfsfunktionen sind klares, elegantes und modernes algorithmenbasiertes Anwendungsdesign.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439921</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sun, 20 Jan 2008 14:27:53 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 14:53:41 GMT]]></title><description><![CDATA[<p>Die Algorithmen lassen sich auf (fast) alle Container anwenden, ohne das es eine Basisklasse geben muß. Das Design ist bewusst so gewählt und ich wette, man würde es heute nochmal so machen. Vielleicht würde es heute Detailsänderungen geben, aber das Paradigma würde heute genauso umgesetzt werden. Man muß das Zeug halt verstehen, dann wird man nicht sagen, das es Altlast ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439947</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Sun, 20 Jan 2008 14:53:41 GMT</pubDate></item><item><title><![CDATA[Reply to von std::vector erben?? on Sun, 20 Jan 2008 14:55:33 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>jghj schrieb:</p>
<blockquote>
<p>Ein Breakpoint nach beiden Objektinitialisierungen im Debugger mit folgenden Outputs von [Objekt].size();</p>
<p>ar.size() = 3958981726<br />
vAr.size() = 0</p>
</blockquote>
<p>Ich hab zwar keine Ahnung, was dein Debugger hier anstellt, aber das Ganze ist ohnehin unsinnig. Die size-Memberfunktion muss in deinem Beispiel gar nicht instantiiert werden - der Versuch sie aufzurufen (ist das überhaupt das, was der Debugger dort tut?) daher sinnfrei. Das Verhalten eines Programms ist nicht für Debuggerausgaben definiert worden - wenn die &quot;Größe&quot; des Vektors gar nicht beobachtbar ist, ist die Analyse von Debuggerausgaben sinnlos, wenn du dich nicht von vornherein auf Compilerinterna festlegen willst.</p>
</blockquote>
<p>Ich bin da jetzt zwar nicht ganz mitgekommen aber habe was entdeckt... man gebe die Rückgabe von size() in printf() und er gibt eine 0 zurück.</p>
<p>Woa ... und ich habe gerade alles durchgetestet es funktioniert .... dann hab ich einen Programmfehler wohl an einer komplett falschen Stelle gesucht, weil ich über das Debuggerergebnis stutzig geworden bin, welches bei mir noch nie falsch war!</p>
<p>Wäre garnicht auf die Idee gekommen, dass die Ausgabe eine unterschiedliche sein kann....</p>
<p>Vielen Dank für die schnelle Unterstützung ... wieder was dazugelernt und 2 Tage durch das Suchen an der falschen Ecke vergeuded <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>Wünsch euch noch einen schönen Sonntag.</p>
<p>mfg jghj</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439951</guid><dc:creator><![CDATA[jghj]]></dc:creator><pubDate>Sun, 20 Jan 2008 14:55:33 GMT</pubDate></item></channel></rss>