<?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[Daten synchron halten zwischen Datenbank-Anzeige]]></title><description><![CDATA[<p>Hallo!</p>
<p>In meinem Projekt verwende ich ein Objekt der Klasse StomachDB:</p>
<pre><code class="language-cpp">class StomachDB
{
  const sAnimalData LoadAnimal(int ID)
  {
    // Code zum laden ...
    // ...

    return m_Anims[ID];
  }

  void DeletePartFromAnimal(int ID)
  {
    // Die daten des tieres werden hier verändert, zB anzahl geladener Dateien usw.
    m_Anims[ID].VeraendereDaten();
  }

  std::vector&lt;sAnimalData&gt; m_Anims;
};
</code></pre>
<p>Über die Methode LoadAnimal lade ich ein Tier (also dateien über das Tier, wie muster etc.) von der Festplatte und gebe eine const-Referenz auf das Tier zurück, welche pointer zu bildern usw., enthält.<br />
Die Methode DeletePartFromAnimal löscht eine Datei von dem Tier von der Festplatte und gibt auch Speicher für geladenene Bilder usw frei.<br />
Dadurch dass ich eine const-Referenz zurückgebe, ist der Benutzer ja auch immer aktuell, weil er ja auf den selben speicher guckt wie StomachDB auch.</p>
<p>Jetzt aber folgendes:</p>
<pre><code class="language-cpp">class DBView
{
  void Display()
  {
    // zeige alle Muster vom gerade geladenen tier
  }

  void Machwas()
  {
    // Ab hier ist m_currData nicht mehr aktuell, weil die DB verändert worden ist
    g_StomachDB-&gt;DeletePartFromAnimal(m_CurrData.ID);
    // das würde abhilfe schaffen, ist aber nicht gut
    m_CurrData = g_StomachDB-&gt;LoadAniaml(m_CurrData.ID);
    // Denn dadurch wird der referenzzähler intern erhöht und der Speicher des 
    // Tieres wird nich richtig freigegeben
  }

  sAnimalData m_CurrData;
}
</code></pre>
<p>Ich bräuchte also sozusagen im DBView-Objekt eine const-Referenz auf die Daten der StomachDB. Leider kann man ja Referenzen als member nur im konstruktor initialisieren, das gerade geleadene Tier variiert aber im laufe des lebens von DBView.</p>
<pre><code class="language-cpp">class DBView
{
  // Muss im konstruktor initialisert werden und kann nicht was anderes zu gewiesen werden
  const sAnimalData&amp; m_CurrData;
}
</code></pre>
<p>Mit pointern hab ichs mir auch schon überlegt, ob das ginge, aber ehrlich gesagt find ich das hässlich.<br />
Habt ihr Ideen wie man das elegant lösen könnte? Dass die Daten zwischen DB und View synchron sind? Ein Observer-Pattern ist hier overkill, da der view ja weiß, wann er die daten braucht. Allerdings bekomme ich eine neue sAnimalData ja nur über LoadAnimal und neu laden will ich nicht.</p>
<p>Hoffe, ihr könnt helfen <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 />
Maxi</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/180735/daten-synchron-halten-zwischen-datenbank-anzeige</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 22:34:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/180735.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 05 May 2007 21:04:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Daten synchron halten zwischen Datenbank-Anzeige on Sat, 05 May 2007 21:05:32 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>In meinem Projekt verwende ich ein Objekt der Klasse StomachDB:</p>
<pre><code class="language-cpp">class StomachDB
{
  const sAnimalData LoadAnimal(int ID)
  {
    // Code zum laden ...
    // ...

    return m_Anims[ID];
  }

  void DeletePartFromAnimal(int ID)
  {
    // Die daten des tieres werden hier verändert, zB anzahl geladener Dateien usw.
    m_Anims[ID].VeraendereDaten();
  }

  std::vector&lt;sAnimalData&gt; m_Anims;
};
</code></pre>
<p>Über die Methode LoadAnimal lade ich ein Tier (also dateien über das Tier, wie muster etc.) von der Festplatte und gebe eine const-Referenz auf das Tier zurück, welche pointer zu bildern usw., enthält.<br />
Die Methode DeletePartFromAnimal löscht eine Datei von dem Tier von der Festplatte und gibt auch Speicher für geladenene Bilder usw frei.<br />
Dadurch dass ich eine const-Referenz zurückgebe, ist der Benutzer ja auch immer aktuell, weil er ja auf den selben speicher guckt wie StomachDB auch.</p>
<p>Jetzt aber folgendes:</p>
<pre><code class="language-cpp">class DBView
{
  void Display()
  {
    // zeige alle Muster vom gerade geladenen tier
  }

  void Machwas()
  {
    // Ab hier ist m_currData nicht mehr aktuell, weil die DB verändert worden ist
    g_StomachDB-&gt;DeletePartFromAnimal(m_CurrData.ID);
    // das würde abhilfe schaffen, ist aber nicht gut
    m_CurrData = g_StomachDB-&gt;LoadAniaml(m_CurrData.ID);
    // Denn dadurch wird der referenzzähler intern erhöht und der Speicher des 
    // Tieres wird nich richtig freigegeben
  }

  sAnimalData m_CurrData;
}
</code></pre>
<p>Ich bräuchte also sozusagen im DBView-Objekt eine const-Referenz auf die Daten der StomachDB. Leider kann man ja Referenzen als member nur im konstruktor initialisieren, das gerade geleadene Tier variiert aber im laufe des lebens von DBView.</p>
<pre><code class="language-cpp">class DBView
{
  // Muss im konstruktor initialisert werden und kann nicht was anderes zu gewiesen werden
  const sAnimalData&amp; m_CurrData;
}
</code></pre>
<p>Mit pointern hab ichs mir auch schon überlegt, ob das ginge, aber ehrlich gesagt find ich das hässlich.<br />
Habt ihr Ideen wie man das elegant lösen könnte? Dass die Daten zwischen DB und View synchron sind? Ein Observer-Pattern ist hier overkill, da der view ja weiß, wann er die daten braucht. Allerdings bekomme ich eine neue sAnimalData ja nur über LoadAnimal und neu laden will ich nicht.</p>
<p>Hoffe, ihr könnt helfen <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 />
Maxi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279492</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Sat, 05 May 2007 21:05:32 GMT</pubDate></item><item><title><![CDATA[Reply to Daten synchron halten zwischen Datenbank-Anzeige on Sat, 05 May 2007 23:00:36 GMT]]></title><description><![CDATA[<p>Hallo zur späten Stunden. Hoffe mal das ich dein Problem richtig verstanden.<br />
Also du übergibst die ID von CurrData an Delete.(). Diese ändern das richtige CurrData im Vektor.<br />
Nun hat CurrData aber noch alte unveränderte Daten. Und du willst das er sein aktualisertes Ich aus dem Vektor enthält.</p>
<p>Wenn ja, wie wärst damit:</p>
<pre><code class="language-cpp">void DeletePartFromAnimal(sAnimalData&amp; data)
  {
    // Die daten des tieres werden hier verändert, zB anzahl geladener Dateien usw.
    m_Anims[data.ID].VeraendereDaten();
    data = m_Anims[data.ID];
  }
//....
void Machwas()
  {
    g_StomachDB-&gt;DeletePartFromAnimal(m_CurrData);    
  }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1279510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279510</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 05 May 2007 23:00:36 GMT</pubDate></item><item><title><![CDATA[Reply to Daten synchron halten zwischen Datenbank-Anzeige on Sun, 06 May 2007 04:16:18 GMT]]></title><description><![CDATA[<p>Maxi schrieb:</p>
<blockquote>
<p>... Ein Observer-Pattern ist hier overkill...</p>
</blockquote>
<p>Warum? Jedes Tier registriert sich bei der DB als Listener und wenn etwas an seinen Daten verändert wird, wird das tier über die Änderung informiert und passt seine Daten an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279526</guid><dc:creator><![CDATA[Going To California]]></dc:creator><pubDate>Sun, 06 May 2007 04:16:18 GMT</pubDate></item></channel></rss>