<?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[C++-Designfrage]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes Programm: In einer while-Schleife werden einzelne Bilder aus einem Video ausgelesen. Mit einer Klasse Painter soll auf den Bilder gezeichnet werden können. Bedingung: Der Painter soll auf dem Originalbild zeichnen, also keine eigene Kopie speichern:</p>
<pre><code class="language-cpp">// Pseudocode
Painter p;
while(readFrame()) {
    Image img = readImage();
    p.setImage(img); // Soll nur Referenz speichern

    // [...] zeichnen mit Painter, Darstellung usw.
}
</code></pre>
<p>Wie realisiert man das am besten, so dass auch immer gleich sichergestellt wird, dass das Bild, was dem Painter zugeordnet wurde, auch stets existiert. Der beste Ansatz, der mir einfällt wäre folgender:</p>
<pre><code class="language-cpp">// Beispielcode
class PainterPointer {
public:

	PainterPointer(Image *to) : myImage(to){

	}

        void draw();
        void drawX();
        void drawY();

private:

	Image* myImage;
};

// Pseudocode
Painter p;
while(readFrame()) {
    Image img = readImage();
    p.setImage(&amp;img); // Soll nur Referenz speichern

    // [...] zeichnen mit Painter, Darstellung usw.
}
</code></pre>
<p>In den zeichnen Methoden des Painters wie draw oder drawX müsste man dann immer prüfen, ob zumindest der Pointer gesetzt wurde:</p>
<pre><code class="language-cpp">void drawX() {
if(myImage) {

}
}
</code></pre>
<p>Gibt's da noch einen besseren Ansatz?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/268579/c-designfrage</link><generator>RSS for Node</generator><lastBuildDate>Tue, 01 Sep 2026 16:47:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/268579.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 11 Jun 2010 08:13:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C++-Designfrage on Fri, 11 Jun 2010 08:13:27 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes Programm: In einer while-Schleife werden einzelne Bilder aus einem Video ausgelesen. Mit einer Klasse Painter soll auf den Bilder gezeichnet werden können. Bedingung: Der Painter soll auf dem Originalbild zeichnen, also keine eigene Kopie speichern:</p>
<pre><code class="language-cpp">// Pseudocode
Painter p;
while(readFrame()) {
    Image img = readImage();
    p.setImage(img); // Soll nur Referenz speichern

    // [...] zeichnen mit Painter, Darstellung usw.
}
</code></pre>
<p>Wie realisiert man das am besten, so dass auch immer gleich sichergestellt wird, dass das Bild, was dem Painter zugeordnet wurde, auch stets existiert. Der beste Ansatz, der mir einfällt wäre folgender:</p>
<pre><code class="language-cpp">// Beispielcode
class PainterPointer {
public:

	PainterPointer(Image *to) : myImage(to){

	}

        void draw();
        void drawX();
        void drawY();

private:

	Image* myImage;
};

// Pseudocode
Painter p;
while(readFrame()) {
    Image img = readImage();
    p.setImage(&amp;img); // Soll nur Referenz speichern

    // [...] zeichnen mit Painter, Darstellung usw.
}
</code></pre>
<p>In den zeichnen Methoden des Painters wie draw oder drawX müsste man dann immer prüfen, ob zumindest der Pointer gesetzt wurde:</p>
<pre><code class="language-cpp">void drawX() {
if(myImage) {

}
}
</code></pre>
<p>Gibt's da noch einen besseren Ansatz?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1910460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1910460</guid><dc:creator><![CDATA[painter39228]]></dc:creator><pubDate>Fri, 11 Jun 2010 08:13:27 GMT</pubDate></item><item><title><![CDATA[Reply to C++-Designfrage on Fri, 11 Jun 2010 08:40:01 GMT]]></title><description><![CDATA[<p>Du könntest statt einem Pointer eine Referenz benutzen. So ist sichergestellt, dass zumindest immer ein zum Zeitpunkt des Aufrufs von setImage gültiges Objekt übergeben wird. Da in deinem Beispiel Image aber auf dem Stack angelegt wird, musst Du sicherstellen, dass das Objekt noch existiert, wenn du PainterPointer-Methoden nutzt. Der Aufruf if(myImage) hilft da nur bedingt weiter, denn der prüft nur, ob kein NULL-Pointer übergeben wurde und nicht, ob der Pointer noch auf was gültiges zeigt.</p>
<p>Irgendwie kapier ich den Sinn des zweiten Code-Stücks aber nicht. Welche Signatur hat Painter::setImage? Nimmt das ein PainterPointer-Objekt entgegen so dass der Pinter auf Image implizit konvertiert wird durch den Konvertierungs-Konstruktor oder nimmt das gleich ein Image* entgegen? In dem Fall wäre PainterPointer nutzlos.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1910493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1910493</guid><dc:creator><![CDATA[Mahlzeit]]></dc:creator><pubDate>Fri, 11 Jun 2010 08:40:01 GMT</pubDate></item><item><title><![CDATA[Reply to C++-Designfrage on Fri, 11 Jun 2010 08:45:11 GMT]]></title><description><![CDATA[<p>Mit deinem momentanen Ansatz wird das Bild zerstört, was den Zeiger invalidiert. Aber du könntest z.B. sowas machen:</p>
<pre><code class="language-cpp">std::auto_ptr&lt;Image&gt; readImage();
void Painter::SetImage(std::auto_ptr&lt;Image&gt; image);

// ...
Painter p;
std::auto_ptr&lt;Image&gt; image = readImage();
p.setImage(image);
</code></pre>
<p>Oder direkt:</p>
<pre><code class="language-cpp">p.setImage(readImage());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1910497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1910497</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 11 Jun 2010 08:45:11 GMT</pubDate></item><item><title><![CDATA[Reply to C++-Designfrage on Fri, 11 Jun 2010 09:01:13 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Mit deinem momentanen Ansatz wird das Bild zerstört, was den Zeiger invalidiert. (snip)</p>
</blockquote>
<p>Also von der Objekt-Lifetime her ist das schon in Ordnung, da das Image-Objekt bis zum Ende des while-Blocks lebt. Wenn die Methoden, die auf dem Image-Objekt arbeiten, nur innerhalb des while-Blocks aufgerufen werden (und so versteh ich den Kommentar), ist das imho schon in Ordnung, oder überseh ich was?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1910509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1910509</guid><dc:creator><![CDATA[Mahlzeit]]></dc:creator><pubDate>Fri, 11 Jun 2010 09:01:13 GMT</pubDate></item><item><title><![CDATA[Reply to C++-Designfrage on Fri, 11 Jun 2010 15:42:12 GMT]]></title><description><![CDATA[<p>Nein, das wäre schon in Ordnung. Aber dann verstehe ich nicht, warum <code>Painter</code> das <code>Image</code> überhaupt speichert. Dieses kann doch direkt an die Memberfunktionen übergeben werden?</p>
<pre><code class="language-cpp">Painter painter;
while (...)
{
    Image image = ...;
    painter.draw(image);
    ...
}
</code></pre>
<p>Oder, wenn <code>Painter</code> nur eine Hilfsklasse fürs Zeichnen ist, warum ist dessen Instanz bereits ausserhalb der Schleife deklariert? Ich würde es in diesem Fall eher so lösen:</p>
<pre><code class="language-cpp">while (...)
{
    Image image = ...;
    Painter painter(image);
    painter.draw();
    ...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1910808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1910808</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 11 Jun 2010 15:42:12 GMT</pubDate></item></channel></rss>