<?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[Designvorschläge]]></title><description><![CDATA[<p>Hi, ich habe eine Basisklasse A<br />
und mehrere abgeleitete Klassen.</p>
<p>Ich benötige mindestens ein A um einen Algorithmus durchzuführen.<br />
Jede Klasse wird aus einer Textdatei eingelesen.</p>
<p>Wie erzeuge ich nun die Objekte am besten. Ich schreibs mal besser in Pseudo-C++ auf.</p>
<pre><code class="language-cpp">class A
{
  notwendige Attribute, die mein Programm braucht
}

class B : A
{
  ein paar Attribute mehr
}

main()
{
  A* hiermit_will_ich_arbeiten;
  // Wie fülle ich das auf, wenn Dateizugriffe nötig sind?
}

//Idee 1: Methode
A* readFile(filename)
{
entscheide anhand dateieindung was genau zu tun ist.
A* r = new Was_benötigt_wird();
return r;

//gefällt mir nicht, weil das new versteckt wird
}

//Idee 2: Konstruktor erledigt das
class C: A
{
C(filename)
{lese datei aus}
} 
}
</code></pre>
<p>Vor einem ähnlichen Problem stehe ich auch beim Zurückschreiben der Datenstrukturen.<br />
Gibt es da schöne ANsätze?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/298630/designvorschläge</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 20:17:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/298630.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 24 Jan 2012 18:08:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Designvorschläge on Tue, 24 Jan 2012 18:08:34 GMT]]></title><description><![CDATA[<p>Hi, ich habe eine Basisklasse A<br />
und mehrere abgeleitete Klassen.</p>
<p>Ich benötige mindestens ein A um einen Algorithmus durchzuführen.<br />
Jede Klasse wird aus einer Textdatei eingelesen.</p>
<p>Wie erzeuge ich nun die Objekte am besten. Ich schreibs mal besser in Pseudo-C++ auf.</p>
<pre><code class="language-cpp">class A
{
  notwendige Attribute, die mein Programm braucht
}

class B : A
{
  ein paar Attribute mehr
}

main()
{
  A* hiermit_will_ich_arbeiten;
  // Wie fülle ich das auf, wenn Dateizugriffe nötig sind?
}

//Idee 1: Methode
A* readFile(filename)
{
entscheide anhand dateieindung was genau zu tun ist.
A* r = new Was_benötigt_wird();
return r;

//gefällt mir nicht, weil das new versteckt wird
}

//Idee 2: Konstruktor erledigt das
class C: A
{
C(filename)
{lese datei aus}
} 
}
</code></pre>
<p>Vor einem ähnlichen Problem stehe ich auch beim Zurückschreiben der Datenstrukturen.<br />
Gibt es da schöne ANsätze?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2171985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171985</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Tue, 24 Jan 2012 18:08:34 GMT</pubDate></item><item><title><![CDATA[Reply to Designvorschläge on Tue, 24 Jan 2012 18:16:28 GMT]]></title><description><![CDATA[<p>Ja, Smartpointer. Optimalerweise mit C++11 unique_ptr:</p>
<pre><code class="language-cpp">class A
{
};

class B : public A
{
};

std::vector&lt;std::unique_ptr&lt;A&gt;&gt; readAs(const std::string&amp; filename)
{
  std::vector&lt;std::unique_ptr&lt;A&gt;&gt; as;
  // ..
  as.push_back(std::unique_ptr&lt;A&gt;(new A)); // Eventuell bastelst du dir ein make_unique().
  // ..
  return as;
}

int main()
{
  auto as = readAs(&quot;as.txt&quot;);
  for (auto i = begin(as); i != end(as); ++i)
    std::cout &lt;&lt; **i; // Setzt überladenen operator &lt;&lt; für A voraus.
} // Destruktor von vector zerstört seine unique_ptr, deren Destruktoren zerstören die As.
</code></pre>
<p>Und vergiss den virtuellen Destruktor für A nicht. <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2171986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171986</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 24 Jan 2012 18:16:28 GMT</pubDate></item><item><title><![CDATA[Reply to Designvorschläge on Tue, 24 Jan 2012 18:18:32 GMT]]></title><description><![CDATA[<p>Mir ist nicht so ganz klar, was du letztendlich vor hast. Willst du verschiedene Dateiformate unterstützten?</p>
<p>Herauszufinden, um was für ein Typ es sich handelt ist normalerweise ein Zeichen dafür, dass das Design nicht gut ist. Lösen kann man das häufig dadurch, dass die Klasse selber die Methode implementiert und diese nur aufgerufen wird. Die Klasse weiß dann selber was zu tun ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2171987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171987</guid><dc:creator><![CDATA[lll]]></dc:creator><pubDate>Tue, 24 Jan 2012 18:18:32 GMT</pubDate></item><item><title><![CDATA[Reply to Designvorschläge on Tue, 24 Jan 2012 18:31:15 GMT]]></title><description><![CDATA[<p>Ja, ich möchte verschiedene Dateiformate unterstützen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2171991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2171991</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Tue, 24 Jan 2012 18:31:15 GMT</pubDate></item><item><title><![CDATA[Reply to Designvorschläge on Tue, 24 Jan 2012 20:04:41 GMT]]></title><description><![CDATA[<p>In dem Fall würde ich eine Klasse schreiben, die alles verwaltet. Nennen wie sie ganz einfach mal Manager. Dieser Manager bietet dann die Möglichkeit eine Datei zu laden:</p>
<pre><code class="language-cpp">Manager.loadFile(&quot;bla.xyz&quot;);
</code></pre>
<p>Das Ergebnis ist dann ein File * (dazu jetzt mehr). Die Klassenhierachie kann dann in etwa so aufgebaut werden, wie du es schon angedacht hast. Damit das funktioniert (und Sinn macht) müssen natürlich alle Dateiformate etwas gemeinsam haben. Bei Bildern wären das z.B. die Pixel die am Ende angezeigt werden können.</p>
<p>Könnte man dann so lösen:</p>
<pre><code class="language-cpp">class File
{
 Pixel *pixel;

 virtual void load() = 0;

 virtual Pixel *getPixel() { return pixel; }
};

class FileXYZ : public File
{
 virtual void load() { doMagic(); }
};
</code></pre>
<p>Dann kann loadFile entweder das File * zurückgeben oder es verwaltet diese und du greifst über den []-Operatoren darauf zu:</p>
<pre><code class="language-cpp">Manager[&quot;bla.xyz&quot;].getPixel();
</code></pre>
<p>Dann gibt manager auch den Speicher frei oder man gibt den Speicher vorzeitig manuell frei:</p>
<pre><code class="language-cpp">Manager.unloadFile(&quot;bla.xyz&quot;);
</code></pre>
<p>Letztendlich ist das aber nur eine von vielen Möglichkeiten. Ich bin was das angeht auch kein Experte und tue mich da immer etwas schwer. Mir würde in dem Zusammenhang noch das Strategy Pattern einfallen. Leider ist die Entscheidung, wie man vorgehen sollte oft von vielen Faktoren abhängig, die den Leuten hier nicht alle bekannt sein können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2172014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172014</guid><dc:creator><![CDATA[lll]]></dc:creator><pubDate>Tue, 24 Jan 2012 20:04:41 GMT</pubDate></item><item><title><![CDATA[Reply to Designvorschläge on Tue, 24 Jan 2012 20:29:57 GMT]]></title><description><![CDATA[<p>Mir gefällt die Idee mit den unique_pointern recht gut.<br />
Nur hab ich von rvalues und C++11 noch gar keine Ahnung.</p>
<p>Ich stelle mir das grad irgendwie so vor:</p>
<pre><code class="language-cpp">std::unique_pointer&lt;A&gt; readFile(filename)
{ 
  // entscheide welcher Typ
  Typ * b = new Typ;
  std::unique_pointer&lt;A&gt; p(b);

  // kann ich das so zurückgeben?
  return p;
}

main()
{
  // völlig blind geraten
  std::unique_pointer&lt;A&gt; a = std::move(readFile(filename));
 // unique_pointer können ja nicht kopiert werde, also müsste ich moven, aber keine AHnung ob das so stimmt
 // gerade mal 10 Minuten google stecken jetzt dahinter und ich finde keine richtig gute Quelle
}
</code></pre>
<p>Also , ich begebe mich hier auf völliges Neuland, aber bin bereit mich einzuarbeiten.<br />
Wenn ihr Tipps dafür habt oder schonmal Korrekturvorschläge für meinen wahrscheinlichen Quatsch oben, ich bitte darum.</p>
<p>Gute Quellen sind auch immer willkommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2172030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172030</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Tue, 24 Jan 2012 20:29:57 GMT</pubDate></item><item><title><![CDATA[Reply to Designvorschläge on Tue, 24 Jan 2012 20:36:01 GMT]]></title><description><![CDATA[<p>shisha schrieb:</p>
<blockquote>
<p>Wenn ihr Tipps dafür habt oder schonmal Korrekturvorschläge für meinen wahrscheinlichen Quatsch oben, ich bitte darum.</p>
</blockquote>
<p>Das ist grundsätzlich schon ok. Nur dass du keinen extra Zeiger einführen solltest, unique_ptr&lt;A&gt;(new A) reicht völlig. Und genau, du gibst ihn einfach per value zurück. std::move brauchst du nicht. Weder bei return, noch in der main. (Warum schreibst du eigentlich kein int vor die main? oO)<br />
std::move ist wie ein Cast, und sollte auch nur so verwendet werden:</p>
<pre><code class="language-cpp">foo(unique_ptr&lt;A&gt;(new A)); // Kein move

unique_ptr&lt;A&gt; p(new A);
return p; // kein move

unique_ptr&lt;A&gt; = bar(); // kein move

unique_ptr&lt;A&gt; p(new A);
foo(move(p)); // move, da nicht klar ist, dass du das auch wirklich möchtest.
</code></pre>
<p>Ansonsten zur &quot;Allgemeinbildung&quot; nach &quot;Move-Konstruktoren&quot; suchen, die sind quasi die Basis des unique_ptr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2172036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172036</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 24 Jan 2012 20:36:01 GMT</pubDate></item><item><title><![CDATA[Reply to Designvorschläge on Tue, 24 Jan 2012 21:47:49 GMT]]></title><description><![CDATA[<p>Könnte nützlich sein: <a href="http://en.wikipedia.org/wiki/Builder_pattern" rel="nofollow">http://en.wikipedia.org/wiki/Builder_pattern</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2172068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2172068</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Tue, 24 Jan 2012 21:47:49 GMT</pubDate></item></channel></rss>