<?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 als Parameter&#x2F;Übergabe eines temporären Objekts möglich?]]></title><description><![CDATA[<p>Guten Abend.</p>
<p>Ich habe eine Frage zum Übungsbeispiel Ü2 aus dem Kapitel 12.7 aus dem Buch &quot;Die C++ Programmiersprache&quot; von B. Stroustrup. Das Beispiel findet sich im Netz zB. unter:</p>
<p><a href="http://books.google.com/books?id=YR5CqZcFJU8C&amp;pg=PA345&amp;lpg=PA345&amp;dq=%22implementieren+sie+ein+einfaches+graphiksystem%22&amp;source=web&amp;ots=QGwl7awg2I&amp;sig=SCNDSMVZCFBmJnYKMOPWgOd35KU#PPA345,M1" rel="nofollow">http://books.google.com/books?id=YR5CqZcFJU8C&amp;pg=PA345&amp;lpg=PA345&amp;dq=%22implementieren+sie+ein+einfaches+graphiksystem%22&amp;source=web&amp;ots=QGwl7awg2I&amp;sig=SCNDSMVZCFBmJnYKMOPWgOd35KU#PPA345,M1</a></p>
<p>Ich habe versucht, aus dem Stroustrup-Beispiel den für meine Frage wesentlichen Teil (hoffentlich richtig) in ein kleines C++-Programm zu destillieren. Nachfolgend poste ich erstmal das Programm samt Fehlermeldung, anschließend folgt meine Frage:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

// ==================================
class Form
{
public:
    virtual ~Form() {}
    virtual void zeichne() const = 0;
};

// ==================================
class Punkt: public Form
{
public:
    virtual ~Punkt() {}
    virtual void zeichne() const
    {
        std::cout &lt;&lt; &quot;Punkt&quot; &lt;&lt; std::endl;
    }
};

// ==================================
void draw(Form * f)
{
    std::cout &lt;&lt; &quot;zeichne &quot;;
    f-&gt;zeichne();
}

// ==================================
int main()
{
    Form * p1 = new Punkt;
    draw(p1);
    delete p1;

    Punkt p2;
    draw(&amp;p2);

    draw(new Punkt()); // geht, aber wer gibt Speicher frei?
    draw(&amp;Punkt());    // Warnung: Referenz auf temporäres Objekt
    draw(Punkt());     // Fehler: cannot convert Punkt to Form*
}
</code></pre>
<p>Ausgabe beim Kompilieren mit djgpp:</p>
<pre><code>D:\cpp&gt;gpp test.cpp -o test.exe -Wall
test.cpp: In function 'int main()':
test.cpp:40: warning: taking address of temporary
test.cpp:41: error: cannot convert 'Punkt' to 'Form*' for argument '1' to 'void
draw(Form*)'
</code></pre>
<p><strong>Meine Frage:</strong><br />
In der Angabe des Beispiels kommt folgende Anweisung vor:</p>
<blockquote>
<p>f.zeichne(Kreis(...))</p>
</blockquote>
<p>f.zeichne() sei dabei eine Funktion, die ein Form-Objekt veranlasst, sich zu zeichnen, in meinem Programm ist das die Funktion draw(). Kreis(...) ist ein temporäres Form-Objekt. Der zitierten Anweisung entspricht mE. die Zeile 41 in meinem Programm, die logischerweise fehlschlägt.</p>
<p>Eine Lösung wäre sicherlich, eine draw(Punkt p)-Funktion zu schreiben, ich kann mir aber nicht vorstellen, dass dieser umständliche Weg tatsächlich gemeint war, oder verstehe ich da was falsch?</p>
<p>Vorweg herzlichen Dank für jede Unterstützung.<br />
Roland</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/203746/abstrakte-klasse-als-parameter-übergabe-eines-temporären-objekts-möglich</link><generator>RSS for Node</generator><lastBuildDate>Wed, 07 Oct 2026 19:03:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/203746.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 25 Jan 2008 23:15:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Abstrakte Klasse als Parameter&#x2F;Übergabe eines temporären Objekts möglich? on Sat, 26 Jan 2008 01:06:27 GMT]]></title><description><![CDATA[<p>Guten Abend.</p>
<p>Ich habe eine Frage zum Übungsbeispiel Ü2 aus dem Kapitel 12.7 aus dem Buch &quot;Die C++ Programmiersprache&quot; von B. Stroustrup. Das Beispiel findet sich im Netz zB. unter:</p>
<p><a href="http://books.google.com/books?id=YR5CqZcFJU8C&amp;pg=PA345&amp;lpg=PA345&amp;dq=%22implementieren+sie+ein+einfaches+graphiksystem%22&amp;source=web&amp;ots=QGwl7awg2I&amp;sig=SCNDSMVZCFBmJnYKMOPWgOd35KU#PPA345,M1" rel="nofollow">http://books.google.com/books?id=YR5CqZcFJU8C&amp;pg=PA345&amp;lpg=PA345&amp;dq=%22implementieren+sie+ein+einfaches+graphiksystem%22&amp;source=web&amp;ots=QGwl7awg2I&amp;sig=SCNDSMVZCFBmJnYKMOPWgOd35KU#PPA345,M1</a></p>
<p>Ich habe versucht, aus dem Stroustrup-Beispiel den für meine Frage wesentlichen Teil (hoffentlich richtig) in ein kleines C++-Programm zu destillieren. Nachfolgend poste ich erstmal das Programm samt Fehlermeldung, anschließend folgt meine Frage:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

// ==================================
class Form
{
public:
    virtual ~Form() {}
    virtual void zeichne() const = 0;
};

// ==================================
class Punkt: public Form
{
public:
    virtual ~Punkt() {}
    virtual void zeichne() const
    {
        std::cout &lt;&lt; &quot;Punkt&quot; &lt;&lt; std::endl;
    }
};

// ==================================
void draw(Form * f)
{
    std::cout &lt;&lt; &quot;zeichne &quot;;
    f-&gt;zeichne();
}

// ==================================
int main()
{
    Form * p1 = new Punkt;
    draw(p1);
    delete p1;

    Punkt p2;
    draw(&amp;p2);

    draw(new Punkt()); // geht, aber wer gibt Speicher frei?
    draw(&amp;Punkt());    // Warnung: Referenz auf temporäres Objekt
    draw(Punkt());     // Fehler: cannot convert Punkt to Form*
}
</code></pre>
<p>Ausgabe beim Kompilieren mit djgpp:</p>
<pre><code>D:\cpp&gt;gpp test.cpp -o test.exe -Wall
test.cpp: In function 'int main()':
test.cpp:40: warning: taking address of temporary
test.cpp:41: error: cannot convert 'Punkt' to 'Form*' for argument '1' to 'void
draw(Form*)'
</code></pre>
<p><strong>Meine Frage:</strong><br />
In der Angabe des Beispiels kommt folgende Anweisung vor:</p>
<blockquote>
<p>f.zeichne(Kreis(...))</p>
</blockquote>
<p>f.zeichne() sei dabei eine Funktion, die ein Form-Objekt veranlasst, sich zu zeichnen, in meinem Programm ist das die Funktion draw(). Kreis(...) ist ein temporäres Form-Objekt. Der zitierten Anweisung entspricht mE. die Zeile 41 in meinem Programm, die logischerweise fehlschlägt.</p>
<p>Eine Lösung wäre sicherlich, eine draw(Punkt p)-Funktion zu schreiben, ich kann mir aber nicht vorstellen, dass dieser umständliche Weg tatsächlich gemeint war, oder verstehe ich da was falsch?</p>
<p>Vorweg herzlichen Dank für jede Unterstützung.<br />
Roland</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443807</guid><dc:creator><![CDATA[Thoreau]]></dc:creator><pubDate>Sat, 26 Jan 2008 01:06:27 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse als Parameter&#x2F;Übergabe eines temporären Objekts möglich? on Sat, 26 Jan 2008 00:11:44 GMT]]></title><description><![CDATA[<p>Thoreau schrieb:</p>
<blockquote>
<p>Abstrakte Klasse als Parameter/Übergabe eines temporären Objekts möglich?</p>
</blockquote>
<p>Ja.</p>
<pre><code class="language-cpp">Punkt p2; // &lt;-- ein temporäres Objekt p2
    draw(&amp;p2); // &lt;-- übergabe als Parameter
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1443822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443822</guid><dc:creator><![CDATA[Ramsis]]></dc:creator><pubDate>Sat, 26 Jan 2008 00:11:44 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse als Parameter&#x2F;Übergabe eines temporären Objekts möglich? on Sat, 26 Jan 2008 00:30:38 GMT]]></title><description><![CDATA[<p>Danke.</p>
<p>Ich hab mich wohl missverständlich ausgedrückt durch die Frage im Titel. Meine tatsächliche Frage (im ersten Posting ganz unten) hängt zwar damit zusammen, ist aber anders gelagert.</p>
<blockquote>
<p>Eine Lösung wäre sicherlich, eine draw(Punkt p)-Funktion zu schreiben, ich kann mir aber nicht vorstellen, dass dieser umständliche Weg tatsächlich gemeint war, oder verstehe ich da was falsch?</p>
</blockquote>
<p>Any ideas?</p>
<p>lg<br />
Roland</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443827</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443827</guid><dc:creator><![CDATA[Thoreau]]></dc:creator><pubDate>Sat, 26 Jan 2008 00:30:38 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse als Parameter&#x2F;Übergabe eines temporären Objekts möglich? on Sat, 26 Jan 2008 00:49:43 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18321">@Thoreau</a>: ersetze doch bitte den elendslangen link, der die seitendarstellung etwas in die breite zieht durch diesen hier: <a href="http://tinyurl.com/36wp89" rel="nofollow">http://tinyurl.com/36wp89</a></p>
<p>Ramsis schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Punkt p2; // &lt;-- ein temporäres Objekt p2
    draw(&amp;p2); // &lt;-- übergabe als Parameter
</code></pre>
</blockquote>
<p>Punkt p2 ist allerdings kein temporäres objekt.</p>
<pre><code class="language-cpp">draw(Punkt());
</code></pre>
<p>so wird ein temporäres objekt erzeugt.<br />
temporäre objekte binden an konstante referenzen. deklariere deine funktion draw also so:</p>
<pre><code class="language-cpp">void draw (Form const&amp; f)
{
   //...
   f.draw();
}
</code></pre>
<p>beachte dabei, dass die elementfunktion draw selbst konstant sein muss. (es gibt dafür nur einen hässlichen workaround)</p>
<p>also so:</p>
<pre><code class="language-cpp">class Punkt
{
  virtual void draw () const = 0;
 //...
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1443833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443833</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Sat, 26 Jan 2008 00:49:43 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse als Parameter&#x2F;Übergabe eines temporären Objekts möglich? on Sat, 26 Jan 2008 01:09:03 GMT]]></title><description><![CDATA[<p>queer_boy schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18321">@Thoreau</a>: ersetze doch bitte den elendslangen link, der die seitendarstellung etwas in die breite zieht durch diesen hier: http://@notallowed@.com/36wp89</p>
</blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/14600">@queer_boy</a>: Dein Link funktioniert bei mir nicht. Also draufklicken geht nicht, wenn ich die Verknüpfung kopier und händisch im Browser einfüg, dann geht's schon.</p>
<p>lg<br />
Roland</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443835</guid><dc:creator><![CDATA[Thoreau]]></dc:creator><pubDate>Sat, 26 Jan 2008 01:09:03 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse als Parameter&#x2F;Übergabe eines temporären Objekts möglich? on Sat, 26 Jan 2008 01:11:35 GMT]]></title><description><![CDATA[<p>oh, anscheinend zensiert das forum tinyurls..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443836</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Sat, 26 Jan 2008 01:11:35 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse als Parameter&#x2F;Übergabe eines temporären Objekts möglich? on Sat, 26 Jan 2008 01:45:32 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/14600">@queer_boy</a>: Herzlichen Dank für deine Anregungen und die prompte Hilfe.</p>
<p>Ist eigentlich eh völlig klar, ich hab's mit Referenz schon probiert, aber da dürft ich was anderes falsch gemacht haben.</p>
<p>Habe nun eine zweite draw()-Funktion mit const Referenz (Zeilen 41ff.) neben die draw() mit Pointer als Parameter (Zeilen 34ff.) gestellt, jetzt klappt alles wunderbar (siehe Programm Zeilen 66 und 67).</p>
<p>Das reparierte (und um Klasse Linie erweiterte) Programm schaut nun so aus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

// ==================================
class Form
{
public:
    virtual ~Form() {}
    virtual void zeichne() const = 0;
};

// ==================================
class Punkt: public Form
{
public:
    virtual ~Punkt() {}
    virtual void zeichne() const
    {
        std::cout &lt;&lt; &quot;Punkt&quot; &lt;&lt; std::endl;
    }
};

// ==================================
class Linie: public Punkt
{
public:
    virtual ~Linie() {}
    virtual void zeichne() const
    {
        std::cout &lt;&lt; &quot;Linie&quot; &lt;&lt; std::endl;
    }
};

// ==================================
void draw(const Form * const f)
{
    std::cout &lt;&lt; &quot;zeichne (*) &quot;;
    f-&gt;zeichne();
}

// ==================================
void draw(const Form &amp; f)
{
    std::cout &lt;&lt; &quot;zeichne (&amp;) &quot;;
    f.zeichne();
}

// ==================================
int main()
{
    Form * p1 = new Punkt;
    draw(p1);
    delete p1;

    Form * l1 = new Linie;
    draw(l1);
    delete l1;
    std::cout &lt;&lt; std::endl;

    Punkt p2;
    draw(p2);

    Linie l2;
    draw(l2);
    std::cout &lt;&lt; std::endl;

    draw(Punkt());
    draw(Linie());
}
</code></pre>
<p>Die Ausgabe dazu:</p>
<pre><code>D:\cpp&gt;test
zeichne (*) Punkt
zeichne (*) Linie

zeichne (&amp;) Punkt
zeichne (&amp;) Linie

zeichne (&amp;) Punkt
zeichne (&amp;) Linie
</code></pre>
<p>lg<br />
Roland</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443840</guid><dc:creator><![CDATA[Thoreau]]></dc:creator><pubDate>Sat, 26 Jan 2008 01:45:32 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse als Parameter&#x2F;Übergabe eines temporären Objekts möglich? on Sat, 26 Jan 2008 10:17:43 GMT]]></title><description><![CDATA[<p>Hallo Thoreau,</p>
<p>du bist zwar auf dem richtigen Weg, hast aber für die gesamte Aufgabe noch ein paar Erweiterungen vor dir.<br />
Zuerst einmal solltest du noch die Klasse Fenster definieren und dort dann die Methode 'zeichne' implementieren (anstatt als freie Funktion):</p>
<pre><code class="language-cpp">class Fenster
{
public:
  void zeichne(const Form &amp;form);
};
</code></pre>
<p>Dann benötigt jede deiner Form-Klassen noch entsprechende Parameter beim jeweiligen Konstruktor für die Angabe der Positionen, z.B.</p>
<pre><code class="language-cpp">class Position
{
public:
  Position(int x, int y);
  // ...
};

class Linie : public Form
{
public:
  Linie(const Position &amp;p1, const Position &amp;p2);
};

// weitere Form-Klassen mit Konstruktor
// ...
</code></pre>
<p>Viel Erfolg noch bei der Aufgabe (*3,5), welche ja als sehr umfangreich eingestuft ist.</p>
<p>Mit welchem Grafiksystem willst du denn die Forms (real) zeichnen, oder hast du eine reine Konsolenanwendung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443901</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Sat, 26 Jan 2008 10:17:43 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse als Parameter&#x2F;Übergabe eines temporären Objekts möglich? on Sat, 26 Jan 2008 11:23:04 GMT]]></title><description><![CDATA[<p>Hallo Th,</p>
<p>danke für deine Tipps, aber das habe ich alles schon längst. Es zeichnet alles auch schon brav (reine Konsolenanwendung, Bresenham-Algorithmus zum Linienzeichnen usw.).</p>
<p>Mir ging es tatsächlich nur darum, den Fall draw(Punkt(...)) hinzubekommen (hatte ich eigentlich auch schon, funktionierte aber nicht wegen eines anderen Fehlers, den ich offenbar dann behoben und dadurch wieder was gelöscht hatte... die Tücken der Nacht halt... ;))</p>
<p>Thoreau schrieb:</p>
<blockquote>
<p>Ich habe versucht, aus dem Stroustrup-Beispiel den für meine Frage wesentlichen Teil (hoffentlich richtig) in ein kleines C++-Programm zu destillieren.</p>
</blockquote>
<p>Ich wollte dem Forum nicht mein ausführliches Programm zumuten, sondern meine Frage mit einem hilfreichen Destillat illustrieren (ging ja nur um das Prinzip). Ich lerne seit Herbst C++ und wollte das Stroustrup-Beispiel als Training nutzen (hab viel dabei gelernt).</p>
<p>Danke für die nette Art der Hilfestellung in diesem Forum. <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>
<p>lg<br />
Roland</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443919</guid><dc:creator><![CDATA[Thoreau]]></dc:creator><pubDate>Sat, 26 Jan 2008 11:23:04 GMT</pubDate></item></channel></rss>