<?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[Abstrakte Klasse]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>nehmen wir an ich möchte einer Methode ein Objekt entweder vom Typ Fahrrad oder Auto übergeben. Dann könnte ich doch die Basisklassen Fahrzeug erfinden, davon Auto und Fahrrad ableiten. Der Methode würde ich dann ein Fahrzeug übergeben. Mein Problem: Wie kriege ich es hin das nur Auto oder Fahrrad übergeben wird -&gt; Es darf auf keinen Fall ein Fahrzeug übergeben werden. Im Internet steht ich muß in Fahrzeug eine Mathode als Pure Virtual definieren. Mir fällt aber keine Methode in Fahrzeug ein die von Auto/Fahrrad überschrieben werden. Ich könnte jetzt eine besthende Methode in Fahrzeug pure virtual machen und dann aus Fahrzeug den Methodenkörper nach Fahrrad/Auto den kopieren... wäre aber ein workaround.</p>
<p>Gibt es vielleicht ein einfachere Methode um eine Klasse in C++ abstract zu machen?</p>
<p>Vielen Dank</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/190166/abstrakte-klasse</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 13:24:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/190166.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 20 Aug 2007 11:34:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 11:34:00 GMT]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>nehmen wir an ich möchte einer Methode ein Objekt entweder vom Typ Fahrrad oder Auto übergeben. Dann könnte ich doch die Basisklassen Fahrzeug erfinden, davon Auto und Fahrrad ableiten. Der Methode würde ich dann ein Fahrzeug übergeben. Mein Problem: Wie kriege ich es hin das nur Auto oder Fahrrad übergeben wird -&gt; Es darf auf keinen Fall ein Fahrzeug übergeben werden. Im Internet steht ich muß in Fahrzeug eine Mathode als Pure Virtual definieren. Mir fällt aber keine Methode in Fahrzeug ein die von Auto/Fahrrad überschrieben werden. Ich könnte jetzt eine besthende Methode in Fahrzeug pure virtual machen und dann aus Fahrzeug den Methodenkörper nach Fahrrad/Auto den kopieren... wäre aber ein workaround.</p>
<p>Gibt es vielleicht ein einfachere Methode um eine Klasse in C++ abstract zu machen?</p>
<p>Vielen Dank</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348136</guid><dc:creator><![CDATA[martin_salo]]></dc:creator><pubDate>Mon, 20 Aug 2007 11:34:00 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 11:39:31 GMT]]></title><description><![CDATA[<p>nimm doch als methode:</p>
<pre><code class="language-cpp">double getMaxVelocity()=0;
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">Fahrzeug* clone()=0;
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">std::string getName()=0;
</code></pre>
<p>und wenn du ansonsten keine gemeinsame methode kennst, die beide abgeleiteten klassen benötigen, dann ist das klassendesgin ohnehin fragwürdig</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348142</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Mon, 20 Aug 2007 11:39:31 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 11:40:08 GMT]]></title><description><![CDATA[<p>Davon abgesehen, dass die Übergabe einer Basisklasse absolut keinen Sinn macht, wenn sie nicht das Interface der abgeleiteten Klassen bereitstellt (wie willst Du sonst an die Daten kommen? dynamic_cast und typeid? Schlechtes Design!), kannst Du jederzeit den Destruktor abstrakt machen. Da jede Klasse (auch implizit) einen Destruktor besitzt und da polymorphe Klassen immer auch einen virtuellen Destruktor haben sollten, vergrößert sich dadurch auch nicht die Klasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348145</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 20 Aug 2007 11:40:08 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 11:43:11 GMT]]></title><description><![CDATA[<p>Wenn die Klassen so unterschiedlich sind, daß sie noch nichtmal gemeinsame Methoden haben, lohnt sich eine Ableitungsbeziehung nicht wirklich (vor allem weil du dann in deiner Funktion ständig nachsehen müsstest, was für ein Typ wirklich vorliegt). Wenn die Methoden bei beidem identisch behandelt werden können, wozu hast du das dann in zwei Klassen aufgeteilt?</p>
<p>Im allgemeinen Fall sollte das Design etwa so aussehen:</p>
<pre><code class="language-cpp">class fahrzeug
{
public:
  virtual void fahre(...) = 0 ;// das Fahrzeug kann fahren - aber erst konkrete Klassen wissen, wie
  virtual ~fahrzeug();//Dtor
  ...
};

class fahrrad : public fahrzeug
{
  virtual void fahre(...)
  {
    steig_auf();
    ...tret-tret-keuch-keuch...
  }
  ...
};

class auto : public fahrzeug
{
  virtual void fahre(...)
  {
    starte_motor();
    gibt_gas();
    ...
  }
  ...
};
</code></pre>
<p>(und schon hast du etwas, was du pur virtuell anlegen kannst <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>PS: Und wenn alle Stricke reißen, kannst du immer noch einen pur virtuellen Destruktor definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348150</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 20 Aug 2007 11:43:11 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 11:48:55 GMT]]></title><description><![CDATA[<p>Hi. Also zuerst einmal bietet es sich an, bzw. draengt sich auf, bei einer Basisklasse in einer hierarchie immer den Destruktor virtual zu deklarieren. Der Grund ist, dass wenn du beispiels weise delete auf einen Zeiger der Basisklasse anwendest, schliesslich das gesamte Objekt zerstoert werden soll, und nicht nur der Basis Teil. Und wenn du den Destruktor schon virtuell hast, dann kannst du ihn auch gleich pure virtual machen.</p>
<p>Und einen Funktionsrumpf zu kopieren ist verdoppeln von Informationen, was bei Veraenderungen stark fehleranfaellig ist. Sinvoller ist es, in den abgeleiteten Funktionen die geerbte aufzurufen. Zusammen sieht das dann so aus:</p>
<pre><code class="language-cpp">class Fahrzeug
{
public:
  /*pure*/ virtual ~Fahrzeug() = 0 {};
  /*pure*/ virtual void Fahre() = 0 
    { cout &lt;&lt; &quot;brrrrmmm....&quot; &lt;&lt; endl; }
}

class Auto : public Fahrzeug
{
  ~Auto() {}; //virtual kann man weglassen, wenns in der Elternklasse deklariert wurde...
  virtual void Fahre() //muss man aber nicht
    { Fahrzeug::Fahre(); } //geerbte Methode aufrufen
}
</code></pre>
<p>Kleine Merkregel fuer Klassenhierarchien die im Zusammenhang mit Polymorphie verwendet werden sollen:<br />
normaler Destruktor: man sollte nicht ableiten.<br />
virtual Destruktor: man darf ableiten.<br />
pure virtual Destruktor: man MUSS ableiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348153</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 20 Aug 2007 11:48:55 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 11:54:02 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>: Diese Kombination aus pur virtuell UND Definition sieht zwar recht nett aus, ist aber leider im Ansi Standard nicht erlaubt. Du kannst gerne beides angeben, aber dann mußt du die Methodendefinition hinter der Klasse bringen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348167</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 20 Aug 2007 11:54:02 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 11:59:59 GMT]]></title><description><![CDATA[<p>Das mit dem Pure Destructor würde klappen vielen Dank <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>Zu dem Design: Da könntet Ihr recht haben. Denn meine nächste Frage wäre wie ich in der Methode die ein Fahrzeug bekommt herausbekommen würde was übergeben worden ist.</p>
<p>Methoden der Klasse Fahrzeug:<br />
SetSpeed()<br />
GetSpeed()<br />
SetPrice()<br />
GetPrice()<br />
...</p>
<p>Methoden der Klasse Fahrrad:<br />
SetLenkradGepäckträger()<br />
GetLenkradGepäckträger()</p>
<p>Methoden der Klasse Auto:<br />
SetAnhängerkupplung()<br />
GetAnhängerkupplung()</p>
<p>In den Methoden der Klasse Fahrzeug steckt eine Menge Code zur Überprüfung drin. Deshalb soll dieser nur einmal auftreten. In meiner Hauptapplikation muß aber ein komplettes Fahrzeug da sein. Fahrrad oder Auto. Wie würde ich nun herausbekommen was mir übergeben wurde?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348171</guid><dc:creator><![CDATA[martin_salo]]></dc:creator><pubDate>Mon, 20 Aug 2007 11:59:59 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 12:00:34 GMT]]></title><description><![CDATA[<p>Zur Not kann man auch den Konstruktor protected machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348172</guid><dc:creator><![CDATA[Apollon]]></dc:creator><pubDate>Mon, 20 Aug 2007 12:00:34 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 12:01:28 GMT]]></title><description><![CDATA[<p>entschuldige, war eine Schludrigkeit meinerseits, um das Ganze kuerzer zu gestalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348173</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 20 Aug 2007 12:01:28 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 12:03:41 GMT]]></title><description><![CDATA[<p>Also da ist dein Desing tatsächlich kaputt - entweder du schreibst dir Überladungen für alle Fahrzeug-Typen, die dann auf den jeweiligen Typ spezialisiert sind, oder du verwedest d*** (ich empfehle ersteres - oder eine Überarbeitung des Designs).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348176</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 20 Aug 2007 12:03:41 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 12:09:03 GMT]]></title><description><![CDATA[<p>martin_salo schrieb:</p>
<blockquote>
<p>In den Methoden der Klasse Fahrzeug steckt eine Menge Code zur Überprüfung drin. Deshalb soll dieser nur einmal auftreten. In meiner Hauptapplikation muß aber ein komplettes Fahrzeug da sein. Fahrrad oder Auto. Wie würde ich nun herausbekommen was mir übergeben wurde?</p>
</blockquote>
<p>Ohne typecasts oder typeid (die meist unschoen sind) garnicht. Normalerweise solltest du auch nicht die Typinformation verlieren, wenn du wissen musst, womit du nun genau arbeitest. Lediglich Funktionen, denen egal ist, ob sie nun mit einem Fahrrad oder einem Auto arbeiten, koennen einfach ein Fahrzeug akzeptieren.</p>
<pre><code class="language-cpp">void RenoviereAnhaengerkupplung(Auto&amp; a) 
{ 
  // Es waere sinnlos, das bei einem Fahrzeug zu machen, weil nur Autos sowas haben
}

void KLemmeAufGepaecktraeger(Fahrrad&amp; f, Gepaeckstueck&amp; g) {
  // geht bei Fahrzeugen allgemein nicht, nur bei Fahrraedern
}

void Verkaufe(Fahrzeug&amp; f) 
{ 
  f.SetPrice(); //geht fuer alle fahrzeuge...
}
</code></pre>
<p>Nur wenn du beispielsweise einen Haufen fahrzeuge in einen Container geworfen hast und sie hinterher auseinanderosrtieren musst, ist es wichtig, den Typ wieder rauszufinden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348183</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 20 Aug 2007 12:09:03 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 12:12:42 GMT]]></title><description><![CDATA[<p>Kommando zurück. Ich habs:</p>
<p>Ich mache zwei Methoden in meinem Hauptobjekt:<br />
Anstatt:<br />
SetFortbewegungsmittel(Fahrzeug &amp;Obj);<br />
Mache ich:<br />
SetFortbewegungsmittel(Auto &amp;Obj);<br />
SetFortbewegungsmittel(Fahrrad &amp;Obj);</p>
<p>Und Auto/Fahrrad leite ich wie bisher von Fahrzeug ab. In SetFortbewegungsmittel() kann ich dann kein Fahrzeug mehr übergeben...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348188</guid><dc:creator><![CDATA[martin_salo]]></dc:creator><pubDate>Mon, 20 Aug 2007 12:12:42 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 12:23:04 GMT]]></title><description><![CDATA[<p>Kannst du so oder so nicht, da Fahrzeug dank pure virtual Methoden eine abstrakte Klasse ist. Sprich: zur laufzeit deines Programms gibt es nur Autos, Fahrraeder, meinetwegen auch Trecker oder Zuege, aber keine reinen Fahrzeuge. Und falls du auch noch spaeter ein Motorrad zufuegen moechtest, muesstest du noch eine zusaetzliche Methode SetFortbewegungsmittel(Motorrad&amp; m) definieren usw. Bis dahin hast du also mit der KLassenhierarchie garnichts gewonnen. Zeig doch mal, was du bisher hast, und erklaer uns in groben Zuegen, was du damit erreichen willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348207</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348207</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 20 Aug 2007 12:23:04 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 12:44:56 GMT]]></title><description><![CDATA[<p>In Fahrzeug sind sehr viele Methoden mit Code. Es sind Getter und Setter mit Überprüfung der Daten. Der Dekonstruktor ist pure virtual.<br />
Methoden der Klasse Fahrzeug:</p>
<pre><code class="language-cpp">class Fahrzeug {
SetSpeed() {// Mit Code}
GetSpeed() {// Mit Code}
SetPrice() {// Mit Code}
GetPrice() {// Mit Code}
...
virtual ~Fahrzeug()=0; // Damit Fahrzeug nicht instanziiert werden kann.
}

// Rumpf zum Dekonstruktor:
Fahrzeug:~Fahrzeug() { // Dieser Dekonstruktor wird aufgerufen bei der Zerstörung eines Autos/Fahrrads.
delete obj1;
delete obj2;
...
}
</code></pre>
<p>Die Klassen Fahrrad und Auto haben alle Getter und Setter von Fahrzeug und zusätzlich ein paar Extra Methoden:</p>
<p>Beispielsweise Methoden der Klasse Fahrrad:</p>
<pre><code class="language-cpp">class Fahrrad : public Fahrzeug {
SetLenkradGepäckträger()  {// Mit Code}
GetLenkradGepäckträger()  {// Mit Code}

~Fahrzeug() {
 :~Fahrzeug(); // Objekte der Basisklasse zerstören.
 delete abc;
}
}
</code></pre>
<p>In meiner Hauptklasse habe ich dann zwei Methoden:</p>
<pre><code class="language-cpp">SetFortbewegungsmittel(Fahrrad &amp;F) {
}

SetFortbewegungsmittel(Auto &amp;A) {
}
</code></pre>
<p>Ich muß eh beide Objekte unterschiedlich behandeln. Wenn jetzt noch ein Motorrad hinzukommt hat es auch extra Daten Getter/Setter, so dass ich in meiner Hauptklasse sowieso eine neue Methode machen muß.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348231</guid><dc:creator><![CDATA[martin_salo]]></dc:creator><pubDate>Mon, 20 Aug 2007 12:44:56 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 12:55:12 GMT]]></title><description><![CDATA[<p>martin_salo schrieb:</p>
<blockquote>
<pre><code class="language-cpp">~Fahrzeug() { //sollte wohl Fahhrad heissen
 :~Fahrzeug(); // Objekte der Basisklasse zerstören.
 delete abc;   
}
</code></pre>
</blockquote>
<p>Den Basisklassen Destruktor brauchst du meines Wissens nicht aufzurufen, da die Basisklassen bestandteile immer zerstoert werden, und zwar nach Ausfuehrung des abgeleiteten Destruktors. damit wird auch sichergestellt, dass etwaige abhaengige Aktionen nicht auf ein schon zerstoertes Objekt zugreifen.</p>
<p>Bisher erkenne ich allerdings nicht, wie du in deiner Hauptklasse mit den Fahrzeugen umgehen willst. Wenn du schon bei SetFortbewegungsmittel zwischen den verschiedenen Typen unterscheidest, musst du das vermutlich auch bei der Verwendung in der Hauptklasse, und das widerum klingt nach unmengen von if-else kaskaden bzw. switch-cases</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348238</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 20 Aug 2007 12:55:12 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 13:18:40 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">~Fahrzeug() { 
 :~Fahrzeug(); // Objekte der Basisklasse zerstören. 
 delete abc; 
}
</code></pre>
<p>funzt das übehaupt? ist das std-konform? kommt es da zur laufzeit nicht zu einem bösen absturz??<br />
und überhaupt was soll das bringen???</p>
<p>allg.:</p>
<pre><code class="language-cpp">class Base{ 
public:
Base() {std::cout&lt;&lt;&quot;Base&quot;&lt;&lt;std::endl; }
virtual ~Base(){ std::cout&lt;&lt;&quot;~Base&quot;&lt;&lt;std::endl;} 
};

class D1 : public Base { 
D1 () {std::cout&lt;&lt;&quot;D1 &quot;&lt;&lt;std::endl; }
~D1(){ std::cout&lt;&lt;&quot;~D1 &quot;&lt;&lt;std::endl;}
 };

class D2 : public D1 { 
D2 () {std::cout&lt;&lt;&quot;D2 &quot;&lt;&lt;std::endl; }
~D2(){ std::cout&lt;&lt;&quot;~D2 &quot;&lt;&lt;std::endl;}  
};

int main()
{
  D2 d1;
std::cout&lt;&lt;std::endl;
}
</code></pre>
<p>--&gt; output</p>
<blockquote>
<p>Base<br />
D1<br />
D2</p>
<p>~D2<br />
~D1<br />
~Base</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1348275</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348275</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Mon, 20 Aug 2007 13:18:40 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 13:21:43 GMT]]></title><description><![CDATA[<p>Zuerst war nur Auto da. Mein Aufgabe war das Programm auf Fahrrad zu erweitern. Das ist mir jetzt gelungen, ohne das ich den Code duplizieren musste (doppelter code in Fahrzeug ausgelagert). Mit den if Statements hast Du recht. Ich glaube aber nicht das ich da herum komme. Das Programm muß sich bei einem Fahrrad etwas anders verhalten.</p>
<p>Danke für den Tip mit dem Dekonstruktor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348283</guid><dc:creator><![CDATA[martin_salo]]></dc:creator><pubDate>Mon, 20 Aug 2007 13:21:43 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 13:24:47 GMT]]></title><description><![CDATA[<p>Da solltest du versuchen, dieses unterschiedliche Verhalten IN den Klassen zu verpacken - in Form von virtuellen Methoden (siehe mein Beispiel oben - sowohl auto als auch fahrrad haben eine Methode fahre(), aber jede Klasse hat eine andere Art, wie sie fahren will).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348285</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 20 Aug 2007 13:24:47 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 13:25:00 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/15647">@muffmolch</a>:<br />
Ich wollte sicherstellen das der Dekonstruktor aufgerufen wird. Wenn er zweimal aufgerufen wird wird ein Objekt zweimal deleted. Ich habe den Aufruf aber mitlerweile entfernt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348286</guid><dc:creator><![CDATA[martin_salo]]></dc:creator><pubDate>Mon, 20 Aug 2007 13:25:00 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 13:30:03 GMT]]></title><description><![CDATA[<p>Sei nicht schuechtern, zeig doch einfach dein Programm und was es macht (evtl gekuerzt aufs wesentliche)</p>
<p>martin_salo schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/15647">@muffmolch</a>:<br />
Ich wollte sicherstellen das der Dekonstruktor aufgerufen wird. Wenn er zweimal aufgerufen wird wird ein Objekt zweimal deleted.</p>
</blockquote>
<p>Wenn du Glueck hast passiert nicht viel, aber wenn du im geerbten Destructor z.B. deletes stehen hast, wird beim zweiten mal delete aufgerufen mit einem Argument, das irgendwo aus dem bereits &quot;zerstoerten&quot; gelesen wird.</p>
<blockquote>
<p>And we enter the dark shady realms of undefined behavior.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1348289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348289</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 20 Aug 2007 13:30:03 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 13:39:53 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>: Meine Klassen stellen nur Datenobjekte dar die gefüllt werden. Sie haben nur ein Methode IsValid() die sagt ob das Klassenobjekt mit einem konsitentem Datensatz gefüllt wurde. Alle Datenklasse werden dann einer Klasse zur Verarbeitung gegeben. Würde ich alle Datenklassen mit der Verarbeitungsklasse zusammenlegen hätte ich eine Menge (für mich zu viele) Methoden.</p>
<p>Es widerspricht vielleicht etwas dem OO Ansatz Daten und Funktionen zusammenzufügen, für mich ist es aber schön übersichtlich.</p>
<pre><code class="language-cpp">class Fortbewegung {
SetFahrzeug(Auto A);
SetFahrzeug(Fahrrad F);
AddInsasse(Person P);

DoFortbewegung() throw (UngueltigeAngaben);

IsValid() throw (UngueltigeAngaben);
}
</code></pre>
<p>Den Code kann ich nicht zeigen. Nur soviel es geht um ein Dateiformat in XML wo unterschiedliche Objekte abgespeichert werden. class Fortbewegung ist in Wirklichkeit class DateiformatXYZ.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348304</guid><dc:creator><![CDATA[martin_salo]]></dc:creator><pubDate>Mon, 20 Aug 2007 13:39:53 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 13:47:03 GMT]]></title><description><![CDATA[<p>martin_salo schrieb:</p>
<blockquote>
<p>Es widerspricht vielleicht etwas dem OO Ansatz Daten und Funktionen zusammenzufügen, für mich ist es aber schön übersichtlich.</p>
</blockquote>
<p>Nein, es widerspricht dem OOP-Ansatz, Daten und Methoden zu trennen. Da kannst du gleich auf Objektorientierung verzichten. Und glaub mir, spätestens wenn du weitere Fahrzeugtypen dazubekommst, bleibt von der Übersichtlichkeit nichts mehr übrig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348311</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348311</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 20 Aug 2007 13:47:03 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Mon, 20 Aug 2007 13:53:52 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>: Hatte mich da verschrieben. Bei OO werden natürlich Daten und Funktionen zusammengelegt.</p>
<p>Was ich ändern könnte wäre bei Fahrzeug ein Unterobjekt mit Namen Spezialisierung zu setzen. Spezialisierung wäre dann ein Objekt vom Typ Auto oder Fahrrad. Da müsste ich den Anwendern meines Dateiformates aber wieder eine Menge beibringen. Sie müssten Objekte hierarchisch zusammenbauen. Auto in Fahrzeug packen und Fahrzeug dann in Dateiformat.<br />
Alles hat seine Vor- und Nachteile.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348319</guid><dc:creator><![CDATA[martin_salo]]></dc:creator><pubDate>Mon, 20 Aug 2007 13:53:52 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Tue, 21 Aug 2007 06:26:32 GMT]]></title><description><![CDATA[<p>Und geholfen hast du mit dem Design niemandem - du hast nur deine Fallunterscheidungen von der Klasse Dateiformat in die Klass Fahrzeug verlagert.</p>
<p>Nochmal: Wenn du objektorientiert arbeiten willst, dann bitte richtig - die Klasse Fahrzeug definiert eine feste Schnittstelle von Operationen (für dich von mir aus 'lies_ein()' und 'gib_aus()' als abstrakte Methoden) und die abgeleiteten Klassen überschreiben diese Methoden und bauen dort ihre eigene Art ein, sich einzulesen bzw. auszugeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348640</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 21 Aug 2007 06:26:32 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Tue, 21 Aug 2007 09:22:20 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>: Hm. Da Auto und Fahrrad in Wirklichkeit XML Objekte sind müsste ich jedem Objekt die Methoden lies_ein/WriteToXML und gib_aus/ReadFromXml geben. Und die XmlFile Klasse würde dann jedes der Objekte über die Methoden in das File schreiben oder davon lesen. Ok <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/1348795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348795</guid><dc:creator><![CDATA[martin_salo]]></dc:creator><pubDate>Tue, 21 Aug 2007 09:22:20 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse on Tue, 21 Aug 2007 09:58:03 GMT]]></title><description><![CDATA[<p>Eine kleine Nachfrage: Was macht das public?</p>
<pre><code class="language-cpp">class XMLFormat : public BaseFormat {...}
</code></pre>
<p>Es funktioniert auch wenn ich es weglasse...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348839</guid><dc:creator><![CDATA[martin_salo]]></dc:creator><pubDate>Tue, 21 Aug 2007 09:58:03 GMT</pubDate></item></channel></rss>