<?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[Virtuelle Klassen in Vector]]></title><description><![CDATA[<p>Hallo,<br />
wenn ich in meinen vector&lt;Auftraege*&gt; einen BauAuftrag über die Funktion AuftragHinzu() hinzufügen will, und dann darauf zugreifen will kommt ein Fehler:</p>
<pre><code class="language-cpp">class Auftrag{
private:
enum status{FERTIG, IN BEARBEITUNG,...};
int x,y,z;
time_t start; //Wann der Auftrag ausgeführt werden soll
int status;
public:
Auftrag(int status, time_t start){
this-&gt;status=status;
this-&gt;start=start;
}
~Auftrag();
virtual string Bauen(void)=0;
};
class Bauauftrag:Auftrag{
private:
int gebaeude;
enum gebaeude_{TURM,BRUECKE,WERKSTATT,HAUS};
public:
Bauauftrag(int status, int gebaeude):Auftrag(status);
~Bauauftrag();
virtual string Bauen(void);
};
[...]
vector&lt;Auftrag*&gt; Auftraege;
[...]
void AuftragHinzu(Bauauftrag tasktoadd){
    task *ptr;
    ptr = &amp;tasktoadd;
    this-&gt;Auftraege.insert(this-&gt;Auftraege.end(),ptr);
}

int main(void){
task *ptr;
Bauauftrag Eisenschmiede (...);
ptr = &amp;Eisenschmiede;
Auftraege.insert(Auftraege.end(),ptr);
cout &lt;&lt; account.Auftraege[0]-&gt;Bauen(); //Funktioniert
AuftragHinzu(Eisenschmiede); //Alternativemöglichkeit
cout &lt;&lt; Auftraege[0]-&gt;Bauen(); //Fehler: 
//pure virtual method called terminate called without an active exception

}
</code></pre>
<p>Dem Fehler zufolge wird die virtuelle Methode von Auftrag ausgeführt und nicht die von Bauauftrag... wenn ich die Funktion AuftragHinzu() einfach in die main Methode kopiere, wird dann doch das Bauen() von Bauauftrag ausgeführt... wie kann das sein? <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="😕"
    /><br />
Danke für Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/259979/virtuelle-klassen-in-vector</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 15:48:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/259979.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 30 Jan 2010 11:37:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Virtuelle Klassen in Vector on Sat, 30 Jan 2010 11:37:09 GMT]]></title><description><![CDATA[<p>Hallo,<br />
wenn ich in meinen vector&lt;Auftraege*&gt; einen BauAuftrag über die Funktion AuftragHinzu() hinzufügen will, und dann darauf zugreifen will kommt ein Fehler:</p>
<pre><code class="language-cpp">class Auftrag{
private:
enum status{FERTIG, IN BEARBEITUNG,...};
int x,y,z;
time_t start; //Wann der Auftrag ausgeführt werden soll
int status;
public:
Auftrag(int status, time_t start){
this-&gt;status=status;
this-&gt;start=start;
}
~Auftrag();
virtual string Bauen(void)=0;
};
class Bauauftrag:Auftrag{
private:
int gebaeude;
enum gebaeude_{TURM,BRUECKE,WERKSTATT,HAUS};
public:
Bauauftrag(int status, int gebaeude):Auftrag(status);
~Bauauftrag();
virtual string Bauen(void);
};
[...]
vector&lt;Auftrag*&gt; Auftraege;
[...]
void AuftragHinzu(Bauauftrag tasktoadd){
    task *ptr;
    ptr = &amp;tasktoadd;
    this-&gt;Auftraege.insert(this-&gt;Auftraege.end(),ptr);
}

int main(void){
task *ptr;
Bauauftrag Eisenschmiede (...);
ptr = &amp;Eisenschmiede;
Auftraege.insert(Auftraege.end(),ptr);
cout &lt;&lt; account.Auftraege[0]-&gt;Bauen(); //Funktioniert
AuftragHinzu(Eisenschmiede); //Alternativemöglichkeit
cout &lt;&lt; Auftraege[0]-&gt;Bauen(); //Fehler: 
//pure virtual method called terminate called without an active exception

}
</code></pre>
<p>Dem Fehler zufolge wird die virtuelle Methode von Auftrag ausgeführt und nicht die von Bauauftrag... wenn ich die Funktion AuftragHinzu() einfach in die main Methode kopiere, wird dann doch das Bauen() von Bauauftrag ausgeführt... wie kann das sein? <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="😕"
    /><br />
Danke für Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1847423</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1847423</guid><dc:creator><![CDATA[*MOP*]]></dc:creator><pubDate>Sat, 30 Jan 2010 11:37:09 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Klassen in Vector on Sat, 30 Jan 2010 12:05:40 GMT]]></title><description><![CDATA[<p>Die Einrückung ist ja grauenhaft! Mach das bitte nochmal ordentlich, dass man auch was erkennt.<br />
Ansonsten solltest du dich nochmal mit Gültigkeit von Objekten (wie lange leben sie? Wann wird kopiert? ...) beschäftigen und folgende Funktion genauer untersuchen:</p>
<pre><code class="language-cpp">void AuftragHinzu(Bauauftrag tasktoadd){
    task *ptr;
    ptr = &amp;tasktoadd;
    this-&gt;Auftraege.insert(this-&gt;Auftraege.end(),ptr);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1847440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1847440</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Sat, 30 Jan 2010 12:05:40 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Klassen in Vector on Sat, 30 Jan 2010 12:10:50 GMT]]></title><description><![CDATA[<p>Neben dem was l'abra d'or gesagt hat, vor allem wegen der Einrückung, möchte ich noch die folgenden Dinge anmerken:<br />
1. Verzichte auf globale Variablen.<br />
2. <code>void</code> bei Funktionen ohne Parametern ist in C++ eher unüblich.<br />
3. Schau dir mal die Schnittstelle von<a href="http://www.cplusplus.com/reference/stl/vector/" rel="nofollow"> <code>std::vector</code> </a>an, wenn du den Container schon verwendest. Zum Beispiel <code>push_back</code> und <code>front</code> sind Funktionen, welche du benutzen könntest, anstatt deine &quot;Workarounds&quot;.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1847448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1847448</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 30 Jan 2010 12:10:50 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Klassen in Vector on Sun, 31 Jan 2010 10:46:45 GMT]]></title><description><![CDATA[<p>Sry für den Code <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="🙄"
    /> Hier nochmal ordentlich eingerückt und verbessert:</p>
<pre><code class="language-cpp">class Auftrag{
    private:
    enum status{FERTIG, IN BEARBEITUNG,...};
    int x,y,z;
    time_t start; //Wann der Auftrag ausgeführt werden soll
    int status;
    public:
    Auftrag(int status, time_t start){
        this-&amp;gt;status=status;
        this-&amp;gt;start=start;
    }
    ~Auftrag();
    virtual string Bauen(void)=0;
};
class Bauauftrag:Auftrag{
    private:
    int gebaeude;
    enum gebaeude_{TURM,BRUECKE,WERKSTATT,HAUS};
    public:
    Bauauftrag(int status, int gebaeude):Auftrag(status);
    ~Bauauftrag();
    virtual string Bauen(void);
};
[...]
vector&lt;Auftrag&gt; Auftraege;
[...]
int main(){
    Auftrag *ptr;
    Bauauftrag Eisenschmiede (...);
    ptr = &amp;Eisenschmiede;
    Auftraege.push_back(ptr);
    cout &lt;&lt; Auftraege.front()-&gt;Bauen();
}
</code></pre>
<p>Danke nochmal <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1847806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1847806</guid><dc:creator><![CDATA[*MOP*]]></dc:creator><pubDate>Sun, 31 Jan 2010 10:46:45 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Klassen in Vector on Sun, 31 Jan 2010 09:36:01 GMT]]></title><description><![CDATA[<p>Bauen() wird verwendet, aber nirgends definiert.</p>
<p>Die Art und Weise wie du den Bauauftrag zu der Auftragsliste hinzufügst ist sehr ungewöhnlich. Was spricht gegen das hier?</p>
<pre><code class="language-cpp">Auftraege.push_back(new Bauauftrag());
</code></pre>
<p>Was ist task?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1847907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1847907</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 31 Jan 2010 09:36:01 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Klassen in Vector on Sun, 31 Jan 2010 11:08:27 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Bauen() wird verwendet, aber nirgends definiert.</p>
</blockquote>
<p>Versteh ich nicht... in Zeile 13 und 22 definiere ich es doch?!</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Die Art und Weise wie du den Bauauftrag zu der Auftragsliste hinzufügst ist sehr ungewöhnlich. Was spricht gegen das hier?</p>
<pre><code class="language-cpp">Auftraege.push_back(new Bauauftrag());
</code></pre>
</blockquote>
<p>Hm ich habs jetzt so gemacht:</p>
<pre><code class="language-cpp">int main(){   
    Bauauftrag Eisenschmiede (...);    
    Auftraege.push_back(&amp;Eisenschmiede);
    cout &lt;&lt; Auftraege.front()-&gt;Bauen();
}
</code></pre>
<p>Ich finde das aber auch unschön, weil im Vector nur die Zeiger auf die Objekte gespeichert werden... Hat jemand eine Idee wie man das besser lösen kann?</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Was ist task?</p>
</blockquote>
<p>Hab ich falsch abgeschrieben, im Orginalcode heißt die Klasse Auftrag task. <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/1847944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1847944</guid><dc:creator><![CDATA[*MOP*]]></dc:creator><pubDate>Sun, 31 Jan 2010 11:08:27 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Klassen in Vector on Sun, 31 Jan 2010 12:18:29 GMT]]></title><description><![CDATA[<p>[MOP] schrieb:</p>
<blockquote>
<p>Ich finde das aber auch unschön, weil im Vector nur die Zeiger auf die Objekte gespeichert werden... Hat jemand eine Idee wie man das besser lösen kann?</p>
</blockquote>
<p>Wenn du polymorphes Verhalten möchtest, kommst du nicht um Zeiger herum. Allerdings gibt es für <em>besitzende</em> Zeiger Alternativen wie Boosts Pointer-Container, das nur so als Anmerkung.</p>
<p>Mit</p>
<pre><code class="language-cpp">Auftraege.push_back(&amp;Eisenschmiede);
</code></pre>
<p>referenzierst du die Eisenschmiede nur. Das ist völlig okay, solange du dafür sorgst, dass du nicht auf ungültige Zeiger zugreifst (automatische Objekte werden am Ende des Scopes zerstört).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1847978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1847978</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 31 Jan 2010 12:18:29 GMT</pubDate></item><item><title><![CDATA[Reply to Virtuelle Klassen in Vector on Sun, 31 Jan 2010 13:48:47 GMT]]></title><description><![CDATA[<p>Der Destruktor sollte auch virtual sein. Sonst wirst du Probleme bekommmen, sobald du die Objekte dynamisch allozierst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848043</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Sun, 31 Jan 2010 13:48:47 GMT</pubDate></item></channel></rss>