<?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[Es geht um die Wurst]]></title><description><![CDATA[<p>Hallo!</p>
<p>Um Erfahrung in der Programmiersprache C++ zu sammeln, haben wir uns folgende Aufgabe gestllt:</p>
<p>Schreibe einen Konstruktor fuer Produkte eines Supermarktes. Dann lass davon erben und erweitere die erbenden Klassen.<br />
<em>( so weit lief noch alles gut )</em></p>
<p>Ein Konstruktor ist die angedeutete <strong>Wurst</strong>. Nun wollen wir eine Menge von Objekten erzeugen und die in der Menge ( <em>set &lt;wurst&gt; Menge</em> ) einfuegen.<br />
( Genauer haben wir schon einige Datensaetze in einer Datei gespeichert und wollen alle Datensaetze auslesen und fuer jeden Eintrag ein Wurst-Objekt generieren ).</p>
<p>Nur wissen wir nicht wie wir das machen sollen ?!</p>
<p>Wenn wir ein Objekt in der Testklasse erstellen wird das selbe Objekt immer nur neu ueberschrieben ?!<br />
Wenn wir jedes Mal ein Objekt erstellen und einfuegen und dann mit dem zugehoerigen Destruktor zerstoeren, dann ist es ja auch nicht mehr in der Menge?!<br />
Wenn wir in einer Funktion ein Objekt erstellen und dieses zurueckgeben, sind wir nicht sicher, ob das erzeugte Objekt mit seinen Attributen auch so bestehend bleibt ?!</p>
<p>Deswegen wollten wir einen Zeiger auf ein Wurst-Objekt in der Testklasse generieren, der aufrufenden FUnktion uebergeben und dann in der Funktion ein Wurst-Objekt erzeugen lassn worauf der uebergebene Zeiger dann zeigt.<br />
Es laeuft jedoch leider nicht ! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":-("
      alt="😞"
    /></p>
<p>Haben noch so einiges ausprobiert... ( u.a. mit Zeiger auf Zeiger ... )<br />
jedoch egal was wir uebergeben haben ( sei es nur ein Zeiger oder anderes) es klappt nicht.<br />
Selbst in der Datei haben wir herumversucht mit * und &amp; und so ... vergebens<br />
unser letztes Ergebnis seht ihr hier:</p>
<pre><code class="language-cpp">bool make_wurst(std::ifstream *die_datei, wurst** die_wurst, wurst* wurst_pointer) {
	wurst wurst_neu = wurst();
 	lesen(die_datei,&amp;wurst_neu);
	wurst_neu.print();
            // es wird ein Wurst-Objekt korrekt generiert und eingelesen 

            // Verzweiflungstaten :
	wurst_pointer = &amp;wurst_neu;
	die_wurst = &amp;wurst_pointer;
	return true;
}

/ ... /

int main()
{
    wurst** w  = &amp;(new wurst);
    wurst* wurst_pointer = new wurst;
    std::ifstream datei(&quot;dateiname&quot;);
    make_wurst(&amp;datei,w,wurst_pointer);

    (wurst_pointer).print();

    return 0;
}
</code></pre>
<p><em>Und damit wir hier nun einen zufriedenstellen Erfolg erzielen koennen ( der da waere : ES FUNKTIONIERT ), frage ich euch:<br />
<strong>Was kann man tun, damit es funktioniert???</strong></em></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/117220/es-geht-um-die-wurst</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 03:45:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/117220.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 04 Aug 2005 14:18:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Es geht um die Wurst on Thu, 04 Aug 2005 14:18:21 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Um Erfahrung in der Programmiersprache C++ zu sammeln, haben wir uns folgende Aufgabe gestllt:</p>
<p>Schreibe einen Konstruktor fuer Produkte eines Supermarktes. Dann lass davon erben und erweitere die erbenden Klassen.<br />
<em>( so weit lief noch alles gut )</em></p>
<p>Ein Konstruktor ist die angedeutete <strong>Wurst</strong>. Nun wollen wir eine Menge von Objekten erzeugen und die in der Menge ( <em>set &lt;wurst&gt; Menge</em> ) einfuegen.<br />
( Genauer haben wir schon einige Datensaetze in einer Datei gespeichert und wollen alle Datensaetze auslesen und fuer jeden Eintrag ein Wurst-Objekt generieren ).</p>
<p>Nur wissen wir nicht wie wir das machen sollen ?!</p>
<p>Wenn wir ein Objekt in der Testklasse erstellen wird das selbe Objekt immer nur neu ueberschrieben ?!<br />
Wenn wir jedes Mal ein Objekt erstellen und einfuegen und dann mit dem zugehoerigen Destruktor zerstoeren, dann ist es ja auch nicht mehr in der Menge?!<br />
Wenn wir in einer Funktion ein Objekt erstellen und dieses zurueckgeben, sind wir nicht sicher, ob das erzeugte Objekt mit seinen Attributen auch so bestehend bleibt ?!</p>
<p>Deswegen wollten wir einen Zeiger auf ein Wurst-Objekt in der Testklasse generieren, der aufrufenden FUnktion uebergeben und dann in der Funktion ein Wurst-Objekt erzeugen lassn worauf der uebergebene Zeiger dann zeigt.<br />
Es laeuft jedoch leider nicht ! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":-("
      alt="😞"
    /></p>
<p>Haben noch so einiges ausprobiert... ( u.a. mit Zeiger auf Zeiger ... )<br />
jedoch egal was wir uebergeben haben ( sei es nur ein Zeiger oder anderes) es klappt nicht.<br />
Selbst in der Datei haben wir herumversucht mit * und &amp; und so ... vergebens<br />
unser letztes Ergebnis seht ihr hier:</p>
<pre><code class="language-cpp">bool make_wurst(std::ifstream *die_datei, wurst** die_wurst, wurst* wurst_pointer) {
	wurst wurst_neu = wurst();
 	lesen(die_datei,&amp;wurst_neu);
	wurst_neu.print();
            // es wird ein Wurst-Objekt korrekt generiert und eingelesen 

            // Verzweiflungstaten :
	wurst_pointer = &amp;wurst_neu;
	die_wurst = &amp;wurst_pointer;
	return true;
}

/ ... /

int main()
{
    wurst** w  = &amp;(new wurst);
    wurst* wurst_pointer = new wurst;
    std::ifstream datei(&quot;dateiname&quot;);
    make_wurst(&amp;datei,w,wurst_pointer);

    (wurst_pointer).print();

    return 0;
}
</code></pre>
<p><em>Und damit wir hier nun einen zufriedenstellen Erfolg erzielen koennen ( der da waere : ES FUNKTIONIERT ), frage ich euch:<br />
<strong>Was kann man tun, damit es funktioniert???</strong></em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/845747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/845747</guid><dc:creator><![CDATA[Raute50]]></dc:creator><pubDate>Thu, 04 Aug 2005 14:18:21 GMT</pubDate></item><item><title><![CDATA[Reply to Es geht um die Wurst on Thu, 04 Aug 2005 14:33:23 GMT]]></title><description><![CDATA[<pre><code>bool make_wurst(std::ifstream *die_datei, wurst** die_wurst, wurst* wurst_pointer) {
    wurst wurst_neu = wurst();
     lesen(die_datei,&amp;wurst_neu);
    wurst_neu.print();
            // es wird ein Wurst-Objekt korrekt generiert und eingelesen

            // Verzweiflungstaten :
    wurst_pointer = &amp;wurst_neu;
    die_wurst = &amp;wurst_pointer;
    return true;
}
</code></pre>
<p>Dein wurst_neu ist ein lokales Objekt. Das bedeutet nach verlassen der Funktion wird es freigegeben und der Zeiger, welchem du diese Adresse zugewiesen hast, ist unbestimmt!</p>
<p>Ich versteh net ganz warum du hier nen &quot;2-fach-Pointer&quot; benutzt?<br />
Entweder legst dein Objekt mit new an. Dann kannst du auch den Zeiger verwerten, musst aber den Speicher selbstständig freigeben, oder du benutzt dein set wo du es reinschiebst. Da wird das Objekt dann ja kopiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/845761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/845761</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Thu, 04 Aug 2005 14:33:23 GMT</pubDate></item><item><title><![CDATA[Reply to Es geht um die Wurst on Thu, 04 Aug 2005 20:41:47 GMT]]></title><description><![CDATA[<p>so sollte das erstmal gehen</p>
<pre><code class="language-cpp">wurst* make_wurst( std::istream* die_datei ) { // std::istream reicht
    wurst* wurst_neu = new wurst;
    lesen( die_datei, wurst_neu );
    wurst_neu-&gt;print();
            // es wird ein Wurst-Objekt korrekt generiert und eingelesen
    return wurst_neu; // mit Wurst-Zeiger raus
}

int main()
{
    std::ifstream datei(&quot;dateiname&quot;);
    wurst* w = make_wurst( &amp;datei );
    w-&gt;print();
    delete w; // aufräumen nicht vergessen
    return 0;
}
</code></pre>
<p>Wenn diese noch in einem set&lt; wurst &gt; eingefügt werden sollen, ist es leichter die ganze Wurst zu kopieren <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>
<pre><code class="language-cpp">wurst make_wurst( std::istream* die_datei ) { // std::istream reicht
    wurst wurst_neu;
    lesen( die_datei, &amp;wurst_neu );
    wurst_neu.print();
    // es wird ein Wurst-Objekt korrekt generiert und eingelesen
    return wurst_neu; // mit der ganzen Wurst raus
}

int main()
{
    std::ifstream datei(&quot;dateiname&quot;);
    std::set&lt; wurst &gt; wuerste;
    wuerste.insert( make_wurst( &amp;datei ) );
    return 0;
}
</code></pre>
<p>dazu benötigst Du aber für wurst einen operator&lt; oder einen eigenen Comperator, um zwei Würste miteinander zu vergleichen. Wenn die Würste in einer Ableitungshierarchie stehen und in dem set auch Objekte anderer klassen untergebracht werden sollen, wird's aufwendiger.</p>
<p>Gruß<br />
Werner</p>
<p>PS.: Klassen, die wurst heißen sind <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/846056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/846056</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 04 Aug 2005 20:41:47 GMT</pubDate></item><item><title><![CDATA[Reply to Es geht um die Wurst on Fri, 05 Aug 2005 16:19:09 GMT]]></title><description><![CDATA[<p>Zum themanamen: Meinst du etwa eine kaka-wurst? <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="😉"
    /> <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="😉"
    /> <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="😉"
    /><br />
(witz)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/846668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/846668</guid><dc:creator><![CDATA[non4me]]></dc:creator><pubDate>Fri, 05 Aug 2005 16:19:09 GMT</pubDate></item><item><title><![CDATA[Reply to Es geht um die Wurst on Tue, 09 Aug 2005 09:30:04 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>so sollte das erstmal gehen</p>
<pre><code class="language-cpp">wurst* make_wurst( std::istream* die_datei ) { // std::istream reicht
    wurst* wurst_neu = new wurst;
    lesen( die_datei, wurst_neu );
    wurst_neu-&gt;print();
            // es wird ein Wurst-Objekt korrekt generiert und eingelesen
    return wurst_neu; // mit Wurst-Zeiger raus
}

int main()
{
    std::ifstream datei(&quot;dateiname&quot;);
    wurst* w = make_wurst( &amp;datei );
    w-&gt;print();
    delete w; // aufräumen nicht vergessen
    return 0;
}
</code></pre>
<p>Wenn diese noch in einem set&lt; wurst &gt; eingefügt werden sollen, ist es leichter die ganze Wurst zu kopieren <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>
<pre><code class="language-cpp">wurst make_wurst( std::istream* die_datei ) { // std::istream reicht
    wurst wurst_neu;
    lesen( die_datei, &amp;wurst_neu );
    wurst_neu.print();
    // es wird ein Wurst-Objekt korrekt generiert und eingelesen
    return wurst_neu; // mit der ganzen Wurst raus
}

int main()
{
    std::ifstream datei(&quot;dateiname&quot;);
    std::set&lt; wurst &gt; wuerste;
    wuerste.insert( make_wurst( &amp;datei ) );
    return 0;
}
</code></pre>
<p>dazu benötigst Du aber für wurst einen operator&lt; oder einen eigenen Comperator, um zwei Würste miteinander zu vergleichen. Wenn die Würste in einer Ableitungshierarchie stehen und in dem set auch Objekte anderer klassen untergebracht werden sollen, wird's aufwendiger.</p>
<p>Gruß<br />
Werner</p>
<p>PS.: Klassen, die wurst heißen sind <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
</blockquote>
<p>Geht das wirklich ??<br />
Ich bin mir bei den ganzen Sachen nicht ganz sicher ?!<br />
Wenn ich in einer Funktion ein neues Objekt erzeuge, wann kann ich es weiter benutzen und wann geht es wieder verloren ?!</p>
<p>Wollten fuer jedes Lebensmittel ( jede Wurst ist bei uns ( verstaendlicherweise ) ein Lebensmittel ) ein eigenes 'set' generieren, weil es eben sonst zu schwierig wird.<br />
Wollen nur ueben, keine perfekte Loesung abgeben?</p>
<p><em>Eine Frage habe ich doch noch</em>:<br />
Wieso sollte ich einen neuen Operator&lt; schreiben? Generell ist mir egal, wo ich in meiner Menge einfuege? Vielleicht ein Operator= waere noch sinnvoll, aber mir gerade zu kompliziziert... Oder muss ich das aus irgendwelchen obskuren Gruenden machen ?!</p>
<p>Schoenen Tach noch ....</p>
<p>#50</p>
]]></description><link>https://www.c-plusplus.net/forum/post/848534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/848534</guid><dc:creator><![CDATA[Raute50]]></dc:creator><pubDate>Tue, 09 Aug 2005 09:30:04 GMT</pubDate></item><item><title><![CDATA[Reply to Es geht um die Wurst on Tue, 09 Aug 2005 09:45:08 GMT]]></title><description><![CDATA[<p>Raute50 schrieb:</p>
<blockquote>
<p><em>Eine Frage habe ich doch noch</em>:<br />
Wieso sollte ich einen neuen Operator&lt; schreiben? Generell ist mir egal, wo ich in meiner Menge einfuege? Vielleicht ein Operator= waere noch sinnvoll, aber mir gerade zu kompliziziert... Oder muss ich das aus irgendwelchen obskuren Gruenden machen ?!</p>
</blockquote>
<p>Um schnellen Zugriff auf die Elemente im set zu gewährleisten hält set seine Elemente sortiert. Dazu muß es sie aber vergleichen können, daher benötigt es einen funktionierenden operator&lt;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/848550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/848550</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Tue, 09 Aug 2005 09:45:08 GMT</pubDate></item><item><title><![CDATA[Reply to Es geht um die Wurst on Tue, 09 Aug 2005 11:38:33 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn ich in einer Funktion ein neues Objekt erzeuge, wann kann ich es weiter benutzen und wann geht es wieder verloren ?!</p>
</blockquote>
<p>Alles was du <strong>lokal</strong>auf dem <strong>Stack</strong> erzeugst, geht in der funktion(block) auch wieder verloren !<br />
genau so die uebergabe parameter und der Return-Wert, nach ende des aufrufes ....<br />
um werte nich zu kopieren, musst eh mit referenzen / pointer arbeiten ...</p>
<pre><code class="language-cpp">int funcX(int * p1 , int * p2)
{
    int temp1 = 2; // lokal aufm Stack ... 
    p1 = &amp;temp1; // mies, ner nichtlokalen Variable wird ne adresse von nem lokalen Object zugewiesen ... 
    int * ptemp2 = new int; // lokal aufn stack iss nur der Zeiger pTemp an sich, es wird aber speicher fuer ne intvariable aufn freestore erzeugt ... 
    p2 = ptemp2 // p2 wird nu auf die adresse aufn freestore gesetzt, sollte kein problem sein ... 
} 
// sobald die funktion zu ende ist, werden deine lokalen variablen ungueltig
// p1 zeigt nun ins daten Nirvana
// ptemp2 gibts natuerlich auch nimmer, aber p2 zeigt an die adresse aufn freestore, welche noch ned geloescht ist ... p2 iss noch gueltig
</code></pre>
<p>das mit dem dynamisch allokieren in ner funktion und den pointer nach aussen geben gewoehn DIr aber nicht an. Das ist sehr schlechter C++ programmierstil.<br />
Faustregel: dynamisch speicher allokieren und wieder deallokieren immer syntaktisch beieinander ... (entweder im selben block, in nem object mit extra alloc / dealloc funktion, oder im Konstruktor / destruktor )</p>
<blockquote>
<p>Wollen nur ueben, keine perfekte Loesung abgeben?</p>
</blockquote>
<p>Naja, nix iss perfekt, man sollte sich aber von anfang an gleich mit den problemen vertraut machen, und von anfang an auch am &quot;Stil&quot; arbeiten.</p>
<p>Viele die ich kenne, haben folgendes Problem:<br />
Pointer sind wichtig, es ist wichtig das zu verstehen - ok<br />
Uebern wir mal pointer - ok<br />
Man pointer sind so klasse generisch, und mit pointer kopiert man auch immer nur 4 Bytes, nie das ganze object, pointer sind klasse ! - falsch ! (rawpointer unter c++ solten die ausnahme sein. wenn dein code aussieht wie sternhimmel bei nacht, solltest noch mal auf C umschulen und c++ sein lassen)</p>
<p>Lernen ok, aber mit system ....</p>
<blockquote>
<p>Wieso sollte ich einen neuen Operator&lt; schreiben? Generell ist mir egal, wo ich in meiner Menge einfuege? Vielleicht ein Operator= waere noch sinnvoll, aber mir gerade zu kompliziziert... Oder muss ich das aus irgendwelchen obskuren Gruenden machen ?!</p>
</blockquote>
<p>Du arbeitest mit der STL, dazu sollte man die STL kennen. Lerne auch, Informationen ueber die verwendeten Libs zu bekommen !!!</p>
<p>zum std::set:<br />
Anforderung: CopyConstructor , Lesser-Comperator (Kleiner-Vergleichsfunktion), per standard wird der &lt; Operator der klasse genommen, kann aber im template ueberschrieben werden ....</p>
<blockquote>
<p>Generell ist mir egal, wo ich in meiner Menge einfuege?</p>
</blockquote>
<p>Lerne die Container der STL sinvoll zu nutzen !!!<br />
wenn du keine Reihenfolge/sortierung/Zugriff ueber B-Baum brauchst ... warum dann ein Set ???</p>
<p>Das eigentliche Problem:<br />
Dein Beispiel klingt eigentlich trivial, beherbergt aber mehr Probleme als du auf den 1 Blick siehst.<br />
- containerklassen<br />
- evtl. Operatorueberladung an abgeleiteten klassen<br />
- Polymorphie, damit bedingt dynamische allokation ...<br />
- quasi virtuelle Konstruktoren (durch deine serialisierung) -&gt; kann man endlos ausdehnen bis man irgendwo bei Objectfactories anlangt <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>streich aus deinen Anforderung erst mal was raus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Wie wuerde ich dein problem loesen ....</p>
<p>- wrapperklasse fuer deinen generischen Wurstzeiger (normal als template, wird aber echt zu kompliziert. ), der alle Informationen / Methoden die deine generischen Wurste (oder lebensmittel) gemeinsam haben inklusive CCtor und lesser operator, so dass das ding in jedes set / map packen kannst ....<br />
- ne Factory funktion, die die den richtigen Wurstzeigerwrapper(inklusive dynamisches erstelltes Wurst object) gleich erstellt, in abhaengigkeit der Eingangswerte .... eventuell als statische funktion gleich am Wrapper object.<br />
- und voiala, schon iss nen std:set total easy zu benutzen ...</p>
<p>Das waer &quot;gutes c++&quot;</p>
<p>Viel Spass noch beim lernen ! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/848641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/848641</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Tue, 09 Aug 2005 11:38:33 GMT</pubDate></item><item><title><![CDATA[Reply to Es geht um die Wurst on Tue, 09 Aug 2005 14:34:05 GMT]]></title><description><![CDATA[<p>RHBaum schrieb:</p>
<blockquote>
<p>von mir selber schrieb:</p>
<blockquote>
<p>Wieso sollte ich einen neuen Operator&lt; schreiben? Generell ist mir egal, wo ich in meiner Menge einfuege? Vielleicht ein Operator= waere noch sinnvoll, aber mir gerade zu kompliziziert... Oder muss ich das aus irgendwelchen obskuren Gruenden machen ?!</p>
</blockquote>
<p>Du arbeitest mit der STL, dazu sollte man die STL kennen. Lerne auch, Informationen ueber die verwendeten Libs zu bekommen !!!</p>
</blockquote>
<p>Ja und wie bekomme ich an die Info's ...??<br />
Habe bis dato bei <a href="http://www.cplusplus.com" rel="nofollow">www.cplusplus.com</a> und <a href="http://www.c-plusplus.net" rel="nofollow">www.c-plusplus.net</a> immer nach Informationen gesucht, jedoch mit unterschiedlichem Erfolg.<br />
Gibt es eine bessere Quelle ??</p>
<p>weiter von vorhin ... schrieb:</p>
<blockquote>
<p>zum std::set:<br />
Anforderung: CopyConstructor , Lesser-Comperator (Kleiner-Vergleichsfunktion), per standard wird der &lt; Operator der klasse genommen, kann aber im template ueberschrieben werden ....</p>
</blockquote>
<p>Habe nachgelesen, das in 'map' automatisch geordnet eingfuegt wird. Habe deswegen den <em>operator &lt;</em> überschrieben, jedoch reicht das nicht.<br />
Muss ich jetzt alle Relationen überschreiben ?!</p>
<p>etwas weiter tiefer im Text : schrieb:</p>
<blockquote>
<p>Wie wuerde ich dein problem loesen ....</p>
<p>- wrapperklasse fuer deinen generischen Wurstzeiger (normal als template, wird aber echt zu kompliziert. ), der alle Informationen / Methoden die deine generischen Wurste (oder lebensmittel) gemeinsam haben inklusive CCtor und lesser operator, so dass das ding in jedes set / map packen kannst ....<br />
- ne Factory funktion, die die den richtigen Wurstzeigerwrapper(inklusive dynamisches erstelltes Wurst object) gleich erstellt, in abhaengigkeit der Eingangswerte .... eventuell als statische funktion gleich am Wrapper object.<br />
- und voiala, schon iss nen std:set total easy zu benutzen ...</p>
<p>Das waer &quot;gutes c++&quot;</p>
</blockquote>
<p>Das glaube ich gerne nur habe ich allein bei ca. 36,94% Deines Textes ( fast gar ) keine Ahnung, was Du von mir möchtest ?! <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="😕"
    /> <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>
<p>Werde versuchen folgendes mehr zu verinnerlichen :<br />
- wrapperklasse<br />
- <em>Generischer</em> Wurstzeiger<br />
- template<br />
- CCtor ( sollte das eine Abkürzung für Konstruktor sein )<br />
- lesser Operator ( oder nur ein Verschreiber für <em>b</em>esser, auch wenn bei mir das b und das l auf der Tastatur ziemlich weit voneinander entfernt sind<br />
- die Bedeutung des Operators ( wie kann ich erreichen, dass etwas sowohl in jedes set als auch in jede map kommen kann ?? )<br />
- Factory Function<br />
- Wurstzeigerwrapper ( vielleicht hilft mir die wrapperklasse dabei <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /> )</p>
<p>nette aufmunternde Worte: schrieb:</p>
<blockquote>
<p>Viel Spass noch beim lernen ! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<p>Die Hoffnung stirbt zuletzt!</p>
<p>Trotzdem erst ein Mal ein Danke!</p>
<p>#50</p>
]]></description><link>https://www.c-plusplus.net/forum/post/848777</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/848777</guid><dc:creator><![CDATA[Raute50]]></dc:creator><pubDate>Tue, 09 Aug 2005 14:34:05 GMT</pubDate></item><item><title><![CDATA[Reply to Es geht um die Wurst on Tue, 09 Aug 2005 16:04:20 GMT]]></title><description><![CDATA[<p>Raute50 schrieb:</p>
<blockquote>
<p>Ja und wie bekomme ich an die Info's ...??<br />
Habe bis dato bei <a href="http://www.cplusplus.com" rel="nofollow">www.cplusplus.com</a> und <a href="http://www.c-plusplus.net" rel="nofollow">www.c-plusplus.net</a> immer nach Informationen gesucht, jedoch mit unterschiedlichem Erfolg.<br />
Gibt es eine bessere Quelle ??</p>
</blockquote>
<p>Ich benutze <a href="http://www.roguewave.com/support/docs/sourcepro/stdlibref/booktoc.html" rel="nofollow">das hier</a> als referenz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/848834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/848834</guid><dc:creator><![CDATA[prolog]]></dc:creator><pubDate>Tue, 09 Aug 2005 16:04:20 GMT</pubDate></item><item><title><![CDATA[Reply to Es geht um die Wurst on Tue, 09 Aug 2005 17:06:27 GMT]]></title><description><![CDATA[<blockquote>
<p>Ja und wie bekomme ich an die Info's ...??</p>
</blockquote>
<p>STL:<br />
<a href="http://www.sgi.com/tech/stl/" rel="nofollow">http://www.sgi.com/tech/stl/</a></p>
<p>Naja, aber ehrlich, immer im Inet danach suchen ist laestig umstaendlich etc.<br />
Wenn wirklich an C++ intressiert bist, wirst frueher oder spaeter Literatur in handfester Form bevorzugen ...</p>
<p>&quot;Die C++ Standard Biblothek&quot; 3. Auflage mitlerweile, iss ne gute Sache da</p>
<p>Nen gutes C++ Buch was auf Neueinsteiger eingeht ist auch goldwert, allein um den EInstieg zu finden und paar vernuenftige Beispielprogramm-Ideen zu bekommen(nen Gorssteil der Einsteiger will gleich mit nem 3D SPiel loslegen)</p>
<blockquote>
<p>Habe nachgelesen, das in 'map' automatisch geordnet eingfuegt wird. Habe deswegen den operator &lt; überschrieben, jedoch reicht das nicht.<br />
Muss ich jetzt alle Relationen überschreiben ?!</p>
</blockquote>
<p>map hat nen key, und Body ...<br />
Key muss CCtor haben und lesser Operator (oder du ueberschreibst das am Template)<br />
Body muss nur CCtor haben (wird auch nicht Sortiert)<br />
CCtor = Copy Constructor</p>
<pre><code class="language-cpp">class C
{
public:
    C(); // Standard Ctor
    C(const C &amp; rx); // CCTor mit constanter referenz
    ~C(); //Destruktor, gibts immer nur einen, zum deleten brauch ma keine parameter :p 
    virtual ~C();   // Bei klasse von denen du ableiten(vererben) erlauben willst, solltest du den virtual machen ... 
}
</code></pre>
<p>Warum brauch die map den CCTor ? weil sie in Ihrem Allokierten Speicher eine Kopie deiner klasse anlegt ... auch wichtig zu wissen ! Dazu nimmt sie prinzipiell den CCTor</p>
<blockquote>
<p>nur habe ich allein bei ca. 36,94% Deines Textes ( fast gar ) keine Ahnung, was Du von mir möchtest ?!</p>
</blockquote>
<p>wird schon noch <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="🙂"
    /> iss nich so schlimm, wenn du nich alles gleich verstehst ...</p>
<p>wrapperklasse - Wrapper - Umhuellung. in C++ eine Klasse, die dir den Zugriff auf was anderes Kapselt, und deinen speziellen beduernissen anpasst. Bei den DesignPatterns(Sammlung von konzeptionellen Musterloesungen) auch manchmal unter Adapter zu finden.<br />
In deinem Fall eine klasse, die intern einen Rohen zeiger auf ein Wurst-Object haelt, (du erinnerst dich, rohe zeiger allein sind nich so gut in C++) sich um dessen erzeugung und zerstoerung kuemmert, und den Lesser operator sowei CCtor implementiert. Da der lesser operator spezifisch ist bei dir ( was kleiner iss bestimmt dein inhalt), ist das nicht nur nen smartpointer sondern nen Wrapper / Adapter ...</p>
<p>Generischer Wurstzeiger - zeiger auf ein Wurst Object. Da in deinen Anforderungen die rede von Vererbung ist :</p>
<pre><code class="language-cpp">class Wurst
{
public:
    Wurst();
    virtual ~Wurst(); // richtig du willst vererben ,also destrukur immer virtual 
};

class LeberWurst : public Wurst
{
    LeberWurst ();
    virtual ~LeberWurst (); 
}

// irgendwo in den tiefen einer implementation 

LeberWurst * pLeberWurst = new LeberWurst; // erzeugen eines speziellen Leberwurst-Zeigers
Wurst * pWurst = pLeberWurst; // hier zuweisung deines Speziellen Zeigers an nen generischeren WurstZeiger ...
</code></pre>
<p>Das meinte ich mit generischen Wurstzeiger <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>template - Programiertechnik unter C++. Zum schreiben von generischen klassen, ohne vererbung. Template deshalb, weil du keine spezielle klasse in dem moment schreibst sondern nur eine Vorlage (Template) und darin ein oder mehrere platzhalter fuer Datentypen / Werte hasst. erst wenn du die klasse mit nem dem speziellen Datentypen / werten benutzt, ist der compiler in der lage, deinen code zu generieren ...<br />
Der groesste teil der STL (Standard Template Library) sind templates ....</p>
<p>CCtor - Copy Construktor - siehe oben</p>
<p>lesser Operator - &lt; Operator (kleiner (lesser) Operator)<br />
wird so meist deklariert:</p>
<pre><code class="language-cpp">class C
{
    // Konstrukor destruktor usw lass ich mal weg
    bool operator &lt; (const C &amp; rx);
}
// und schon kann man den verwenden ... 
C x1; 
C x2;

if(x1 &lt; x2)
// usw usf ...
</code></pre>
<p>Factory Function - Aus den Design patterns ... Funktionen die nur dafuer da sind, anhand von unterschiedlichen eingangsparametern, unterschiedliche klassen(Leberwurst, Blutwurst, Salami) mit gemeinsamer Basisklasse (Vererbung) zu generieren , dir dann einen Zeiger auf die gemeinsame Basisklasse zurueckgeben (Wurst)</p>
<p>Wurstzeigerwrapper - ein Wrapper fuern Wurstzeiger <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Hoffe das hilft bisserl weiter, und du bekommst nen Gefuehl, auf was du dich hier einlaesst <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="😉"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> <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>Tamplates und Designpatters solltest im moment eh nich beachten, das kommt eigentlich ganz ganz spaet ... da braucht man halt schon die anderen grundlagen zu ...</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/848863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/848863</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Tue, 09 Aug 2005 17:06:27 GMT</pubDate></item><item><title><![CDATA[Reply to Es geht um die Wurst on Tue, 09 Aug 2005 18:13:35 GMT]]></title><description><![CDATA[<p>Sollte der op&lt; nicht besser als binärer friend implementiert werden ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/848908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/848908</guid><dc:creator><![CDATA[prolog]]></dc:creator><pubDate>Tue, 09 Aug 2005 18:13:35 GMT</pubDate></item><item><title><![CDATA[Reply to Es geht um die Wurst on Wed, 10 Aug 2005 07:36:54 GMT]]></title><description><![CDATA[<p>prolog schrieb:</p>
<blockquote>
<p>cd ~/pub<br />
more beer</p>
</blockquote>
<p>finde ich cool ( auch wenn ich nicht in jedem Ordner ein pub-Verzeichnis habe, deswegen das ~ ) !</p>
<p>Mache mir als Gag mal so ein Verzeichnis mit so einer Datei.....</p>
<p>Und nun wieder zu C++ ...</p>
<p>#50</p>
]]></description><link>https://www.c-plusplus.net/forum/post/849117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849117</guid><dc:creator><![CDATA[Raute50]]></dc:creator><pubDate>Wed, 10 Aug 2005 07:36:54 GMT</pubDate></item><item><title><![CDATA[Reply to Es geht um die Wurst on Wed, 10 Aug 2005 07:58:13 GMT]]></title><description><![CDATA[<blockquote>
<p>Sollte der op&lt; nicht besser als binärer friend implementiert werden ?</p>
</blockquote>
<p>Jo eigentlich schon ...<br />
macht aber auch wirklich nur nen Unterschied, wenn du impliziete Konvertierungen zulaesst. Auf der anderen Seite macht ne externe Implementierung nix kapput ... von daher ok, lieber extern als friend.</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/849124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849124</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Wed, 10 Aug 2005 07:58:13 GMT</pubDate></item><item><title><![CDATA[Reply to Es geht um die Wurst on Wed, 10 Aug 2005 09:08:46 GMT]]></title><description><![CDATA[<p>Hellas,</p>
<p>habe diese Version mal versucht zu implementieren:</p>
<p>Werner Salomon schrieb:</p>
<blockquote>
<p>so sollte das erstmal gehen</p>
<pre><code class="language-cpp">wurst make_wurst( std::istream* die_datei ) { // std::istream reicht
    wurst wurst_neu;
    lesen( die_datei, &amp;wurst_neu );
    wurst_neu.print();
    // es wird ein Wurst-Objekt korrekt generiert und eingelesen
    return wurst_neu; // mit der ganzen Wurst raus
}

int main()
{
    std::ifstream datei(&quot;dateiname&quot;);
    std::set&lt; wurst &gt; wuerste;
    wuerste.insert( *make_wurst( &amp;datei ) ); 
        // Im Original ohne * funktioniert aber nur mit *
    return 0;
}
</code></pre>
<p>dazu benötigst Du aber für wurst einen operator&lt; oder einen eigenen Comperator, um zwei Würste miteinander zu vergleichen. Wenn die Würste in einer Ableitungshierarchie stehen und in dem set auch Objekte anderer klassen untergebracht werden sollen, wird's aufwendiger.</p>
<p>Gruß<br />
Werner</p>
<p>PS.: Klassen, die wurst heißen sind <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
</blockquote>
<p>Den Operator&lt; habe ich so geschrieben :</p>
<pre><code class="language-cpp">friend bool operator&lt; ( wurst w,wurst v)
		{
		 			 return ( w.qualitaet &gt; v.qualitaet);
		}
</code></pre>
<p>und die abgeänderte Version von make_wurst() sieht so aus</p>
<pre><code class="language-cpp">wurst* make_wurst2( std::ifstream *datei)
{
 			 wurst* neu = new wurst;
 			 lesen(datei, neu);
 			 neu-&gt;print();
 			 return neu;
}
</code></pre>
<p>meine main() sieht so aus :</p>
<pre><code class="language-cpp">int main(int argc, char *argv[])
	set&lt;wurst&gt; Wuerste;
	std::ifstream datei(&quot;dateiname&quot;);
	char c;
	datei.get(c);
	datei.get();
	datei.get();
	switch (c) {
		case 'K' :
			break;
		case 'W' :
			cout &lt;&lt;&quot;es ist eine WURST\n\n&quot;;
			Wuerste.insert(*make_wurst2(&amp;datei));
			Wuerste.insert(*make_wurst2(&amp;datei));
			Wuerste.insert(*make_wurst2(&amp;datei));

			cout &lt;&lt; &quot;Ich habe nun &quot; &lt;&lt; Wuerste.size()
					 &lt;&lt; &quot;Wuerste am Start!&quot;;
			//make_wurst(&amp;datei,w,wurst_pointer);
			break;
		default :
			cout &lt;&lt;&quot; Wieso komme ich in dieses besch...  default rein ?! &quot;;
	}
    cout &lt;&lt;&quot; \n\n\nFertig!\n\n&quot;;
    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
}
</code></pre>
<p>In dateiname steht folgendes:</p>
<pre><code>W::wurst,2.22,3,4,5,6,77,TIER
W::wurstchen,2.34,5,6,7,8,90,jaja
W::wuerste,1.23,9,8,7,6,574,nein
K::CH,2.2,3,4,5,6,7,gauda
NName,2.99,4,5,
leb,1,3,4,55,6,777,
</code></pre>
<p>Und es tut was es soll ... ( nicht das mich das stört ) !!!</p>
<p>Nur leider habe ich das immer noch nicht so ganz verstanden ...<br />
<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="🙄"
    /><br />
<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="🙄"
    /><br />
<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>
<p>Wenn ich in der lokalen Funktion ein Wurst-Objekt generiere und den Zeiger darauf zurück gebe, wieso klappt das ????</p>
<p>Hoffe ihr verzweifelt nicht an mir, wie ich an C++!</p>
<p>Mache dies nicht ganz freiweillig... Ist ein Projekt, welches meinen Namen mit tragen soll... nur sehe ich schwarz bei meinen <em>Erfolgen</em> ( zu denen ich auch 'Hallo Welt' zähle ) ...</p>
<p>Bis bald vielleicht !!!</p>
<p>#50</p>
]]></description><link>https://www.c-plusplus.net/forum/post/849164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849164</guid><dc:creator><![CDATA[Raute50]]></dc:creator><pubDate>Wed, 10 Aug 2005 09:08:46 GMT</pubDate></item><item><title><![CDATA[Reply to Es geht um die Wurst on Wed, 10 Aug 2005 09:34:42 GMT]]></title><description><![CDATA[<p>Ok, dann schritt fuer schritt <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>mach dir mal paar gedanken wie man so beim design vorgeht:<br />
Design ist so die wichtigste phase, die implementation dann eigentlich nur noch fleissarbeit (wennd as design gut war <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> ).</p>
<p>1. Frage</p>
<blockquote>
<p>W::wurst,2.22,3,4,5,6,77,TIER<br />
W::wurstchen,2.34,5,6,7,8,90,jaja<br />
W::wuerste,1.23,9,8,7,6,574,nein<br />
K::CH,2.2,3,4,5,6,7,gauda<br />
NName,2.99,4,5,<br />
leb,1,3,4,55,6,777,</p>
</blockquote>
<p>Die Dateistructur ist vorgegeben, kannst also nicht selbst was drann drehen ?<br />
wenn ja, wie fest(stabil gegen veraenderungen) ist die ?</p>
<ol start="2">
<li></li>
</ol>
<p>Dein Code in bezug auf den zugriff auf den stream sieht .. argl .. aus <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="🙂"
    /><br />
muss man 3 mal hinschauen, um zu sehen was da machst.<br />
Intuitiver (und damit besser wartbar) waere sowas wie :</p>
<pre><code class="language-cpp">std::ifstream datei(&quot;dateiname&quot;);
while (!datei.eof())
{
    Datensatz dat;
    datei &gt;&gt; dat;
    // und hier irgendwas mit dem Datensatz tun ... 
}
</code></pre>
<p>Deswegen frage ich, wie die datei aussieht, und ob du das drehen kannst, bzw. wie sicher die vor veraenderungen ist ....<br />
Dann kann man die Datensatz klasse modellieren ....</p>
<p>Weiterer Prinzipieller Weg:</p>
<p>deine Spaeteren Objecte (leider willst ja unbedingt polymorphie haben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> )<br />
muessen ja alle geminsam zu irgendwas nuetze sein <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="🙂"
    /><br />
diese Gemeinsamkeiten must herausfinden, und in ner Schnittstelle definieren ....</p>
<p>sowas wie:</p>
<pre><code class="language-cpp">class ILebensMittel
{
protected: 
    ILebensMittel(){};
    virtual ~ILebensMittel(){};
public:
    float getPreis() const = 0;
    const std::string &amp; getName() const = 0;
    // was weiss ich nich noch alles :-) 
};
</code></pre>
<p>Ok, weiter gehts dann in der naechsten Folge <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>Ciao ..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/849190</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849190</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Wed, 10 Aug 2005 09:34:42 GMT</pubDate></item><item><title><![CDATA[Reply to Es geht um die Wurst on Wed, 10 Aug 2005 09:34:57 GMT]]></title><description><![CDATA[<p>Raute50 schrieb:</p>
<blockquote>
<p>Wenn ich in der lokalen Funktion ein Wurst-Objekt generiere und den Zeiger darauf zurück gebe, wieso klappt das ????</p>
</blockquote>
<p>Denke du sprichst die Funktion make_wurst2 an.<br />
Warum sollte das nicht funktionieren. Du generierst die wurst ja am heap. Niemand überschreibt deine Wurst. Anders würde es aussehen wenn make_wurst2 so gecodet wäre:</p>
<pre><code class="language-cpp">wurst * make_wurst( std::istream* die_datei ) { 
    wurst wurst_neu;
    lesen( die_datei, &amp;wurst_neu );
    wurst_neu.print();
    return &amp; wurst_neu; 
}
</code></pre>
<p>In diesem Fall liegt wurst_neu am Stack. Sie wird zwar wahrscheinlich dort noch immer sein wenn make_wurst zum Aufrufer zurückkehrt aber die nächste Funktion die aufgerufen wird verwendet den speicher von wurst_neu und wurst_neu wird überschrieben. Du kannst also die wurst nicht mal kopieren ohne sie zu zerstören.<br />
Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/849192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849192</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Wed, 10 Aug 2005 09:34:57 GMT</pubDate></item><item><title><![CDATA[Reply to Es geht um die Wurst on Wed, 10 Aug 2005 11:34:37 GMT]]></title><description><![CDATA[<p>RHBaum schrieb:</p>
<blockquote>
<p>Ok, dann schritt fuer schritt <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="🙂"
    /><br />
1. Frage</p>
<blockquote>
<p>W::wurst,2.22,3,4,5,6,77,TIER<br />
W::wurstchen,2.34,5,6,7,8,90,jaja<br />
W::wuerste,1.23,9,8,7,6,574,nein<br />
K::CH,2.2,3,4,5,6,7,gauda<br />
NName,2.99,4,5, &lt; hier fehlt eine Zahl, ist mir gerade aufgefallen <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="🙂"
    /> &gt;<br />
leb,1,3,4,55,6,777,</p>
</blockquote>
<p>Die Dateistructur ist vorgegeben, kannst also nicht selbst was drann drehen ?<br />
wenn ja, wie fest(stabil gegen veraenderungen) ist die ?</p>
</blockquote>
<p>Die Datenstruktur haben wir uns selber ausgedacht ...<br />
Vererbungshierarchie: Produkt-&gt;Lebensmittel-&gt;Wurst, Kaese, ...<br />
Eigenschaften:<br />
- Produkt ( char* name,double preis,unsigned int bestand,unsigned int kapazitaet),<br />
- Lebensmittel ( zusätzlich unsigned int gewicht,int haltbarkeit,unsigned int qualitaet),<br />
- Wurst ( zusätzlich nur char* tier)<br />
- Kaese ( adäquate andere 'Zusätze')</p>
<p>Oben ist NName ein Produkt und leb ein Lebensmittel, die Kommata stehen in der Ausgabe nur, weil wir die einzelnen print() Methoden ausprobiert haben.<br />
Lieber eine Debug Ausgabe zuviel, als einen Tag Fehlersuche.</p>
<blockquote>
<ol start="2">
<li></li>
</ol>
<p>Dein Code in bezug auf den zugriff auf den stream sieht .. argl .. aus <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="🙂"
    /><br />
muss man 3 mal hinschauen, um zu sehen was da machst.<br />
Intuitiver (und damit besser wartbar) waere sowas wie :</p>
<pre><code class="language-cpp">std::ifstream datei(&quot;dateiname&quot;);
while (!datei.eof())
{
    Datensatz dat;
    datei &gt;&gt; dat;
    // und hier irgendwas mit dem Datensatz tun ... 
}
</code></pre>
</blockquote>
<p>Die main() sieht nur so aus, weil wir am Anfang stehen, also ist der weitere detaillierte Weg noch offen.<br />
Wir haben uns nur überlegt, wie wir die sets mit den nötigen Objekten füttern...<br />
In der main() kann man gut sehen, dass wir es an einer Wurst überprüfen wollten, bevor wir weiter in's Detail gehen.</p>
<blockquote>
<p>Deswegen frage ich, wie die datei aussieht, und ob du das drehen kannst, bzw. wie sicher die vor veraenderungen ist ....<br />
Dann kann man die Datensatz klasse modellieren ....</p>
<p>Weiterer Prinzipieller Weg:</p>
<p>deine Spaeteren Objecte (leider willst ja unbedingt polymorphie haben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> )<br />
muessen ja alle geminsam zu irgendwas nuetze sein <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="🙂"
    /><br />
diese Gemeinsamkeiten must herausfinden, und in ner Schnittstelle definieren ....</p>
<p>sowas wie:</p>
<pre><code class="language-cpp">class ILebensMittel
{
protected: 
    ILebensMittel(){};
    virtual ~ILebensMittel(){};
public:
    float getPreis() const = 0;
    const std::string &amp; getName() const = 0;
    // was weiss ich nich noch alles :-) 
};
</code></pre>
<p>Ok, weiter gehts dann in der naechsten Folge <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>Ciao ..</p>
</blockquote>
<p>den letzten Teil verstehe ich nicht, bzw. ich sehe nicht ein, was mir das im Moment bringt?!</p>
<p>P.S.:<br />
Muss leider gleich zur Arbeit....<br />
Werde dieses Mal wohl ein wenig zögern, bevor die nächste Frage ( auch wenn sie für euch noch so dumm aussehen mag ) stelle, die mich zum VErzweifeln bringt!</p>
<p>In diesem Sinne ....</p>
<p>#50</p>
]]></description><link>https://www.c-plusplus.net/forum/post/849319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849319</guid><dc:creator><![CDATA[Raute50]]></dc:creator><pubDate>Wed, 10 Aug 2005 11:34:37 GMT</pubDate></item><item><title><![CDATA[Reply to Es geht um die Wurst on Wed, 10 Aug 2005 15:07:08 GMT]]></title><description><![CDATA[<blockquote>
<p>den letzten Teil verstehe ich nicht, bzw. ich sehe nicht ein, was mir das im Moment bringt?!</p>
</blockquote>
<p>Was willst du alles mit den Lebensmitteln machen ???<br />
Du willst doch vielleicht irgendwelche preise ausgeben, listen drucken etc ...</p>
<p>Dazu gibt es 2 Wege ...</p>
<p>1. du kreirst eine klasse die alles kann ...<br />
Also eine lebensmittel-klasse die z.B nen Typ ausgeben, Name und so ...<br />
Felder fuer alle möglichen Daten hat, und bei den typen wo man bestimmte daten nicht braucht, setzt man überall platzhalter ein ...</p>
<p>Vorteil: du brauchst keine Polymorphie</p>
<p>Nachteil: wenn irgendwo mal nen neuer lebensmitteltyp hinzukommt, aenderst alle funktionen die in irgend einer weisse mit der Lebensmittleklasse ueberhaupt zu tun haben ... vergisst irgendwas -&gt; undefiniertes / unlogisches verhalten ...</p>
<p>2. du ueberlegst Dir ne schnittstelle, was alle lebensmittel koennen muessen fuer die speziellen aufgaben ....<br />
Du kannst dir schoene Aufgaben.Objecte(klassen) anlegen, zum drucken, preise berechnen etc, die nur deine Schnittstelle kennen muss.</p>
<p>Nachteil: Du brauchst Polymorphie, du bracuhst zumindest ne rudimentaere Objectfabrik</p>
<p>Vorteil: wenn neue Lebensmitteltypen hinzukommen / bzw sich das von verhalten von anderen anedert ... uberschreibst nur an der betroffenen klasse die virtuellen funktionen ... du brauchst die anderen klassen nich mehr anzufassen.</p>
<p>Bei ganz kleinen projekten, kann man drueber streiten, welcher weg besser ist ... wenn man alles im Blick hat, nie niemals nen anderer den code uebernehmen muss, grosse erweiterungen so gut wie ausgeschlossen sind , dann kann man durchaus mal weg 1 nehmen ...</p>
<p>Bei richtigen projekten -&gt; weg 2</p>
<p>An der Stelle entscheidest du ... zwischen super design, aber unendlich aufwand, projekt wird masslos teuer schon vor der ersten version ... und schneller Implementation, schnelle ergebnisse, aber wenn der programmierer wegfaellt, bzw aenderungen ins haus stehen, artet alles aus ... mal schnell &quot;wir bekommen fisch dazu, der hat nen parameter 'Graeten pro kg' &quot; iss dann nich mehr trivial ....</p>
<p>Aber so wie ich sehe, wuerdest du lieber weg 1 nehmen ? erstmal ...<br />
dann Fang mal an die lebensmittelklasse zu modellieren ...<br />
Ohne polymorphie &quot;erstmal&quot; ne klasse nur fuer &quot;wurst&quot; zu modellieren, wird nicht funktionieren .... weil spaeter aenderst du dann wirklich alles wieder, wenn du was erweiterst ...</p>
<p>wobei mir wirklich der hintergrund fehlt, was genau du alles machen willst ...<br />
getrennte Listen fuer Wurst, Kaese Fisch ... etc machen vielleicht sinn, wenn du nicht viele operationen hasst, die auf alle typen angewand werden muessen ...</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/849531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849531</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Wed, 10 Aug 2005 15:07:08 GMT</pubDate></item><item><title><![CDATA[Reply to Es geht um die Wurst on Thu, 11 Aug 2005 08:00:05 GMT]]></title><description><![CDATA[<p>RHBaum schrieb:</p>
<blockquote>
<p>Aber so wie ich sehe, wuerdest du lieber weg 1 nehmen ? erstmal ...<br />
dann Fang mal an die lebensmittelklasse zu modellieren ...<br />
Ohne polymorphie &quot;erstmal&quot; ne klasse nur fuer &quot;wurst&quot; zu modellieren, wird nicht funktionieren .... weil spaeter aenderst du dann wirklich alles wieder, wenn du was erweiterst ...</p>
</blockquote>
<p>Falls ich das richtig verstanden habe, haben wir Weg 2 gewählt.<br />
Wir haben ( nur in Ansätzen ) versucht so viel wie möglich so früh wie möglich zu implementieren. Sprich gibName(), gibPreis(), ... an der Stelle zu implementieren, wo die Eigenschaften auftreteten ( in diesem Falle schon in Produkt ). Und jedes Mal wenn geerbt wird, wird nur das neu implementiert, was auch neu dazugekommen ist, z.B. bei Lebensmittel Haltbarkeit ( denn nicht automatisch jedes Produkt hat ein MindesHaltbarkeitsDatum ).<br />
Also ich denke, wir haben den Weg 2 eingeschlagen....</p>
<p>Dieses soll ja auch nur eine Gewöhnung sein, damit wir ( wenn die wirkliche Arbeit kommt ) auch nach 'gutem Stil' programmieren ( so fern es uns möglich ist ).</p>
<p>der Herr RHBaum mal wieder schrieb:</p>
<blockquote>
<p>wobei mir wirklich der hintergrund fehlt, was genau du alles machen willst ...<br />
getrennte Listen fuer Wurst, Kaese Fisch ... etc machen vielleicht sinn, wenn du nicht viele operationen hasst, die auf alle typen angewand werden muessen ...</p>
</blockquote>
<p>Na gut dann kommt hier <em><strong>Der Hintergrund:</strong></em><br />
Wir wollten uns im Detail mit Vererbung ( und alles was dazu gehört, sprich Überladen von Funktionen, ... ) beschäftigen und haben uns deswegen <em>Produkte.h</em> überlegt, von denen wir erben, nämlich <em>Lebensmittel</em> und <em>Getränke</em> als erstes. Davon wollten wir weiter erben, unter anderem kommt hier die <em>Wurst</em>.<br />
So weit ging alles gut.</p>
<p>Dann haben wir versucht uns mit Schreiben in und Lesen aus einer Datei zu beschäftigen, und wollten uns eine sinnvolle Aufgabe dazu ausdenken.<br />
An dieser Stelle kommt der <em>Verwalter</em> in das Spiel, der alle Bestände kontrollieren soll.<br />
Er soll ( in unserem Beispiel ) aus einer korrekt gespeicherten Datei lesen und so die Regale füllen, was bedeutet, dass er für jede Ware ( Wurst, Käse, ... ) einen <em>set</em> erzeugt und diesen befüllt.</p>
<p>Also wie im Film: Alles frei erfunden!</p>
<p>Hoffe bei euch sind jetzt ein paar Unklarheiten verschwunden!?</p>
<p><strong>P.S.:</strong><br />
Wenn ihr mir sagt wie, poste ich euch mal die gesammelten Werke, die wir haben ..</p>
<p>#50</p>
]]></description><link>https://www.c-plusplus.net/forum/post/849888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/849888</guid><dc:creator><![CDATA[Raute50]]></dc:creator><pubDate>Thu, 11 Aug 2005 08:00:05 GMT</pubDate></item></channel></rss>