<?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[Create&#x2F;Delete Symmetrie]]></title><description><![CDATA[<p>Hallo,</p>
<p>bis jetzt habe ich es immer so gehalten, dass wenn ein Objekt irgend eine Ressource erzeugt, dieses Objekt die Ressource auch wieder zerstören muss. Jetzt habe ich folgendes Konstrukt:</p>
<p>Ich habe eine Klasse Mesh, die ein 3D-Modell (Auto, Kiste, was auch immer) repräsentiert. Die Klasse Mesh ist im Grunde nur ein dummer Container für die Vertices (Eckpunkte). Erzeugt wird ein Mesh von einem MeshManager, wobei der MeshManager den ganzen Ladevorgang übernimmt.<br />
In Pseudocode sieht das in etwa so aus:</p>
<pre><code class="language-cpp">MeshPtr MeshManager::load(string filename) {
  lade vertex daten aus datei filename in array vertices
  VertexBuffer vertexBuffer;
  createVertexBuffer(&amp;vertexBuffer, vertices); // Erzeugt einen VertexBuffer, der gefüllt ist mit den Vertices

  Mesh mesh = new Mesh(filename);
  mesh-&gt;setVertexBuffer(vertexBuffer);

  MeshPtr ptr(mesh);
  meshList[filename] = ptr;
  return ptr;
}
</code></pre>
<p>Kurz in Worten: Der MeshManager lädt die Vertices aus einer Datei, füllt damit ein Array und erzeugt dann einen VertexBuffer. Dann erzeugt er ein Mesh und setzt den VertexBuffer des meshs auf den eben erzeugten VertexBuffer (Mesh::setVertexBuffer(VertexBuffer* vb) macht nichts anderes als: Mesh::mVB = vb;<br />
Das Problem: Wenn ich den VertexBuffer nicht mehr brauche (zb weil das Mesh zerstört wird) muss der VertexBuffer explizit mit VertexBuffer::Release() zerstört werden. Da das Mesh eh einen Zeiger auf den VertexBuffer hält, könnte ich natürlich einfach im Destruktor von Mesh mVB-&gt;Release() aufrufen. Würde auch klappen, nur ist dann die Symmetrie gestört, weil das Mesh selber ja NICHT den VertexBuffer zeugt hat, sondern der MeshManager.<br />
Aber wenn ich nun das Mesh selber den VertexBuffer erzeugen lasse, übergebe ich der Klasse irgendwie zu viel Verantwortung. Ich finde ein Mesh ist nur ein Geometricontainer und ein Mesh sollte keine Ahnung haben, wie man eine Datei liest etc.<br />
Fändet ihr es vom Design her ok, wenn ich in diesem Fall die Symmetrie verletze (also das der MeshManager den VertexBuffer erzeugt aber NICHT zerstört und das Mesh den übergebenen VertexBuffer zerstört)? Oder würdet ihr es anders machen?</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/248789/create-delete-symmetrie</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 20:19:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/248789.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 29 Aug 2009 09:35:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Create&#x2F;Delete Symmetrie on Sat, 29 Aug 2009 09:35:13 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>bis jetzt habe ich es immer so gehalten, dass wenn ein Objekt irgend eine Ressource erzeugt, dieses Objekt die Ressource auch wieder zerstören muss. Jetzt habe ich folgendes Konstrukt:</p>
<p>Ich habe eine Klasse Mesh, die ein 3D-Modell (Auto, Kiste, was auch immer) repräsentiert. Die Klasse Mesh ist im Grunde nur ein dummer Container für die Vertices (Eckpunkte). Erzeugt wird ein Mesh von einem MeshManager, wobei der MeshManager den ganzen Ladevorgang übernimmt.<br />
In Pseudocode sieht das in etwa so aus:</p>
<pre><code class="language-cpp">MeshPtr MeshManager::load(string filename) {
  lade vertex daten aus datei filename in array vertices
  VertexBuffer vertexBuffer;
  createVertexBuffer(&amp;vertexBuffer, vertices); // Erzeugt einen VertexBuffer, der gefüllt ist mit den Vertices

  Mesh mesh = new Mesh(filename);
  mesh-&gt;setVertexBuffer(vertexBuffer);

  MeshPtr ptr(mesh);
  meshList[filename] = ptr;
  return ptr;
}
</code></pre>
<p>Kurz in Worten: Der MeshManager lädt die Vertices aus einer Datei, füllt damit ein Array und erzeugt dann einen VertexBuffer. Dann erzeugt er ein Mesh und setzt den VertexBuffer des meshs auf den eben erzeugten VertexBuffer (Mesh::setVertexBuffer(VertexBuffer* vb) macht nichts anderes als: Mesh::mVB = vb;<br />
Das Problem: Wenn ich den VertexBuffer nicht mehr brauche (zb weil das Mesh zerstört wird) muss der VertexBuffer explizit mit VertexBuffer::Release() zerstört werden. Da das Mesh eh einen Zeiger auf den VertexBuffer hält, könnte ich natürlich einfach im Destruktor von Mesh mVB-&gt;Release() aufrufen. Würde auch klappen, nur ist dann die Symmetrie gestört, weil das Mesh selber ja NICHT den VertexBuffer zeugt hat, sondern der MeshManager.<br />
Aber wenn ich nun das Mesh selber den VertexBuffer erzeugen lasse, übergebe ich der Klasse irgendwie zu viel Verantwortung. Ich finde ein Mesh ist nur ein Geometricontainer und ein Mesh sollte keine Ahnung haben, wie man eine Datei liest etc.<br />
Fändet ihr es vom Design her ok, wenn ich in diesem Fall die Symmetrie verletze (also das der MeshManager den VertexBuffer erzeugt aber NICHT zerstört und das Mesh den übergebenen VertexBuffer zerstört)? Oder würdet ihr es anders machen?</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1768635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1768635</guid><dc:creator><![CDATA[barios]]></dc:creator><pubDate>Sat, 29 Aug 2009 09:35:13 GMT</pubDate></item><item><title><![CDATA[Reply to Create&#x2F;Delete Symmetrie on Sat, 29 Aug 2009 09:49:48 GMT]]></title><description><![CDATA[<p>Ja, finde ich OK.</p>
<p>Mit <code>mesh-&gt;setVertexBuffer(vertexBuffer);</code> wird <code>mesch</code> zum <em>Besitzer</em> des übergebenen Objekts. Wobei &quot;Besitz&quot; nichts anderes bedeutet, als dass <code>mesh</code> das Objekt zu zerstören hat. Ich würde das vielleicht noch in der Schnittstelle klar machen, indem das Argument von <code>setVertexBuffer()</code> ein <code>auto_ptr</code> (oder so) ist.</p>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1768640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1768640</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Sat, 29 Aug 2009 09:49:48 GMT</pubDate></item><item><title><![CDATA[Reply to Create&#x2F;Delete Symmetrie on Sat, 29 Aug 2009 09:55:05 GMT]]></title><description><![CDATA[<p>Um die Besitzübernahme deutlich zu machen, könnte man es auch z.B. <code>takeVertexBuffer</code> nennen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1768642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1768642</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 29 Aug 2009 09:55:05 GMT</pubDate></item><item><title><![CDATA[Reply to Create&#x2F;Delete Symmetrie on Sat, 29 Aug 2009 10:18:15 GMT]]></title><description><![CDATA[<p>Wenn du damit nicht gücklich bist könntest du auch ne art Ref-Counter in deinen Buffer einbauen.der Manager müsste dann überprüfen wenn der null wird dann könntest du den Buffer auch von ihm löschen lassen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1768652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1768652</guid><dc:creator><![CDATA[Tolpan]]></dc:creator><pubDate>Sat, 29 Aug 2009 10:18:15 GMT</pubDate></item><item><title><![CDATA[Reply to Create&#x2F;Delete Symmetrie on Sat, 29 Aug 2009 13:34:33 GMT]]></title><description><![CDATA[<blockquote>
<p>Fändet ihr es vom Design her ok, wenn ich in diesem Fall die Symmetrie verletze</p>
</blockquote>
<p>Nenn mir irgendeinen guten Grund, warum es nicht OK sein sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1768770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1768770</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 29 Aug 2009 13:34:33 GMT</pubDate></item><item><title><![CDATA[Reply to Create&#x2F;Delete Symmetrie on Sat, 29 Aug 2009 13:40:32 GMT]]></title><description><![CDATA[<p>Tolpan schrieb:</p>
<blockquote>
<p>Wenn du damit nicht gücklich bist könntest du auch ne art Ref-Counter in deinen Buffer einbauen.der Manager müsste dann überprüfen wenn der null wird dann könntest du den Buffer auch von ihm löschen lassen</p>
</blockquote>
<p>Würde ich nicht machen.</p>
<p>Erstens kann das ganz schön schwierig zu implementieren sein. Würde der Manager in einem eigenen Thread die Ref-Counts prüfen? Was ist mit Synchronisation?</p>
<p>Zweitens ist Besitzübernahme ein leicht verständliches und nachvollziehbares Konzept. Vor allem, wenn man es durch Verwendung von auto_ptr oder geeignete Methodennamen (oder beides) im Code dokumentiert.</p>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1768775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1768775</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Sat, 29 Aug 2009 13:40:32 GMT</pubDate></item></channel></rss>