<?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[Objekt &amp;quot;initialisieren&amp;quot;]]></title><description><![CDATA[<p>Hi,<br />
also im Prinzip stehe ich bei 2 von 3 Klassen immer wieder vor dem selben Problem.<br />
Ich erläutere es mal am Beispiel einer Klasse für eine Schrift (geht analog auch für Fenster und was weiss ich).<br />
Nehmen wir an, ich brauche zum Erstellen der Schrift einen Bezeichner und eine Schriftgroesse. Übergebe ich diese Sachen nun direkt im Konstruktor (1) oder stelle ich eine Methode Create zur Verfuegung um die Schrift zu erzeugen (2).<br />
Mal nur so als &quot;pseudo&quot;-Code veranschaulicht:</p>
<pre><code class="language-cpp">// 1)
class Font
{
Font(name, size);
};

// 2)
class Font
{
Font();
Create(name, size);
};
</code></pre>
<p>Ersteres hat den Vorteil, das man sich darauf verlassen kann (/können sollte), dass die Schrift initialisiert ist (-&gt; weniger Kontrollarbeit) und im Prinzip brauche ich weniger Methoden zum Setzen von Eigenschaften schreiben (wie zum Beispiel Schriftgroesse), weil man dann auch gleich eine neue Schrift erzeugen könnte. Da hoert es aber wohl auch schon auf. Denn ich muss eine Schrift dann eigentlich immer dynamisch erzeugen (imho nicht so toll...).<br />
Die zweite Version ist im Prinzip das genau Gegenteil, was sich auch auf die Vor- und Nachteile bezieht.</p>
<p>Frage: Was haltet Ihr für besser?</p>
<p>Ich tendiere eigentlich zur zweiten Variante (auch weil ich noch in Delphi programmiere und man da eh jedes Objekt über Create initialisiert (was da aber wiederum der Konstruktor ist - *ahhhhh*)), aber bin halt irgendwie noch unentschlossen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Gruss,<br />
DeSoVoDaMu</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/178323/objekt-quot-initialisieren-quot</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Jul 2026 22:04:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/178323.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 10 Apr 2007 11:40:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Objekt &amp;quot;initialisieren&amp;quot; on Tue, 10 Apr 2007 11:40:16 GMT]]></title><description><![CDATA[<p>Hi,<br />
also im Prinzip stehe ich bei 2 von 3 Klassen immer wieder vor dem selben Problem.<br />
Ich erläutere es mal am Beispiel einer Klasse für eine Schrift (geht analog auch für Fenster und was weiss ich).<br />
Nehmen wir an, ich brauche zum Erstellen der Schrift einen Bezeichner und eine Schriftgroesse. Übergebe ich diese Sachen nun direkt im Konstruktor (1) oder stelle ich eine Methode Create zur Verfuegung um die Schrift zu erzeugen (2).<br />
Mal nur so als &quot;pseudo&quot;-Code veranschaulicht:</p>
<pre><code class="language-cpp">// 1)
class Font
{
Font(name, size);
};

// 2)
class Font
{
Font();
Create(name, size);
};
</code></pre>
<p>Ersteres hat den Vorteil, das man sich darauf verlassen kann (/können sollte), dass die Schrift initialisiert ist (-&gt; weniger Kontrollarbeit) und im Prinzip brauche ich weniger Methoden zum Setzen von Eigenschaften schreiben (wie zum Beispiel Schriftgroesse), weil man dann auch gleich eine neue Schrift erzeugen könnte. Da hoert es aber wohl auch schon auf. Denn ich muss eine Schrift dann eigentlich immer dynamisch erzeugen (imho nicht so toll...).<br />
Die zweite Version ist im Prinzip das genau Gegenteil, was sich auch auf die Vor- und Nachteile bezieht.</p>
<p>Frage: Was haltet Ihr für besser?</p>
<p>Ich tendiere eigentlich zur zweiten Variante (auch weil ich noch in Delphi programmiere und man da eh jedes Objekt über Create initialisiert (was da aber wiederum der Konstruktor ist - *ahhhhh*)), aber bin halt irgendwie noch unentschlossen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Gruss,<br />
DeSoVoDaMu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1262893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1262893</guid><dc:creator><![CDATA[DeSoVoDaMu]]></dc:creator><pubDate>Tue, 10 Apr 2007 11:40:16 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt &amp;quot;initialisieren&amp;quot; on Tue, 10 Apr 2007 11:42:56 GMT]]></title><description><![CDATA[<p>Fall 1.</p>
<p>Create()/Init()-Methoden machen nur Sinn wenn Konstruktion und Initialisierung getrennt ablaufen sollen - scheint mir im gegebenen Fall nicht sinnvoll.</p>
<p>Wie du darauf kommst, dass du dann nur noch dynamisch Schriften erzeugen kannst, weiß ich nicht:</p>
<pre><code class="language-cpp">// Viel weniger dynamisch geht imho nicht:
const Font myFont ( &quot;Arial&quot;, 10 );
</code></pre>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1262896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1262896</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Tue, 10 Apr 2007 11:42:56 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt &amp;quot;initialisieren&amp;quot; on Tue, 10 Apr 2007 12:05:32 GMT]]></title><description><![CDATA[<p>Solche create()-Sachen machen in meinen Augen nur dann Sinn, wenn anhand von Parametern ein mir nicht bekannter Typ zurück gegeben wird. Also wenn es polymorph ist. Wenn du nur Font hast und der User weiß, er muß Font instanzieren, lass die create()-Sache weg. Macht keinen Sinn. Mach nen Ctor und gut ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1262923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1262923</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Tue, 10 Apr 2007 12:05:32 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt &amp;quot;initialisieren&amp;quot; on Tue, 10 Apr 2007 12:08:06 GMT]]></title><description><![CDATA[<p>Artchi schrieb:</p>
<blockquote>
<p>Solche create()-Sachen machen in meinen Augen nur dann Sinn, wenn anhand von Parametern ein mir nicht bekannter Typ zurück gegeben wird. Also wenn es polymorph ist. Wenn du nur Font hast und der User weiß, er muß Font instanzieren, lass die create()-Sache weg. Macht keinen Sinn. Mach nen Ctor und gut ist.</p>
</blockquote>
<p>Dann hast du aber eine Factory und create() als static-Methode. das ist hier nicht der Fall. Hier gehts um eine init_object()-Methode.</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1262928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1262928</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Tue, 10 Apr 2007 12:08:06 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt &amp;quot;initialisieren&amp;quot; on Tue, 10 Apr 2007 12:22:57 GMT]]></title><description><![CDATA[<p>Danke für die schnellen Antworten.</p>
<p>Vielleicht habe ich die Gruende fuer die dynamische Erzeugung noch nicht exakt erlaeutert:</p>
<ol>
<li>Ich wuerde die Font dann als Membervariable in einer Klasse nutzen und da wuerde ich den Pfad zu der Schrift ggf. noch nicht zur Konstruktion wissen. Ich wuerde sie also erst im weiteren Verlauf erzeugen, wenn der Pfad/Name klar ist (also dynamisch).</li>
<li>Wenn ich die Schriftgrösse aendern moechte, muesste ich ja im Prinzip wieder eine neue Schrift erzeugen, wenn ich keine Create Methode habe (also auch dynamisch).</li>
</ol>
<p>Um funktionslokale Objekte ging es mir jetzt weniger.</p>
<p>Das sind im Prinzip die Zwei Gruende fuer die 2. Variante.</p>
<p>Gruss,<br />
DeSoVoDaMu</p>
<p>EDIT: ok, man koennte bei ersterer Version sagen, dass es schlechtes Design ist (man muesste den Pfad/Namen halt schon vorher wissen) und bei zweiter koennte man ja eine private/protected Methode zur Initialisierung nutzen, die dann beim setzen einer neuen Schriftgroesse ueber eine Set-Methode einfach aufgerufen wirde. Waere vielleicht die beste Loesung...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1262933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1262933</guid><dc:creator><![CDATA[DeSoVoDaMu]]></dc:creator><pubDate>Tue, 10 Apr 2007 12:22:57 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt &amp;quot;initialisieren&amp;quot; on Tue, 10 Apr 2007 12:32:36 GMT]]></title><description><![CDATA[<p>DeSoVoDaMu schrieb:</p>
<blockquote>
<p>Danke für die schnellen Antworten.</p>
<p>Vielleicht habe ich die Gruende fuer die dynamische Erzeugung noch nicht exakt erlaeutert:</p>
<ol>
<li>Ich wuerde die Font dann als Membervariable in einer Klasse nutzen und da wuerde ich den Pfad zu der Schrift ggf. noch nicht zur Konstruktion wissen. Ich wuerde sie also erst im weiteren Verlauf erzeugen, wenn der Pfad/Name klar ist (also dynamisch).</li>
</ol>
</blockquote>
<pre><code class="language-cpp">class Foo
{
    public:
        void initFont(string path); // zum Laden der Schrift
    private:
        Font* myFont; // im echten leben ist das logisch ein SmartPointer ;)
        // ...
};

void Foo::initFont(string path)
{
    myFont = new Font(path);
}
</code></pre>
<p>Damit verschiebst du das Problem aber nur von &quot;init-Funktion in der Schriftart&quot; zu &quot;init-Funktion beim Benutzer der Schriftart&quot;. Denn solche &quot;init&quot;-Funktionen sind in der Regel ein Problem!!! Du kannst dich nie drauf verlassen dass deine Schriftarten initialisiert sind. <strong>Und das ist einfach schlechtes Design!</strong> Da solltest du eine bessere Loesung finden!</p>
<blockquote>
<ol start="2">
<li>Wenn ich die Schriftgrösse aendern moechte, muesste ich ja im Prinzip wieder eine neue Schrift erzeugen, wenn ich keine Create Methode habe (also auch dynamisch).</li>
</ol>
</blockquote>
<p>Ja und? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Dann erstellst du eine neue Schrift, das ist doch kein Problem. Ich wuerd sogar soweit gehen zu sagen, dass es logisch ist: Ich will eine neue Schriftart, also erstell ich eine neue Schriftart.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1262948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1262948</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Tue, 10 Apr 2007 12:32:36 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt &amp;quot;initialisieren&amp;quot; on Tue, 10 Apr 2007 12:46:59 GMT]]></title><description><![CDATA[<p>DeSoVoDaMu schrieb:</p>
<blockquote>
<p>...<br />
Ersteres hat den Vorteil, das man sich darauf verlassen kann (/können sollte), dass die Schrift initialisiert ist (-&gt; weniger Kontrollarbeit) und im Prinzip brauche ich weniger Methoden zum Setzen von Eigenschaften schreiben (wie zum Beispiel Schriftgroesse), weil man dann auch gleich eine neue Schrift erzeugen könnte. Da hoert es aber wohl auch schon auf. ...</p>
</blockquote>
<p>Zwei Vorteile und kein Nachteil - was gibt es da noch zu überlegen ?</p>
<p>DeSoVoDaMu schrieb:</p>
<blockquote>
<p>...<br />
Die zweite Version ist im Prinzip das genau Gegenteil, was sich auch auf die Vor- und Nachteile bezieht....</p>
</blockquote>
<p>Genau: Zwei Nachteile und kein Vorteil.</p>
<p>DeSoVoDaMu schrieb:</p>
<blockquote>
<p>...<br />
...Ich tendiere eigentlich zur zweiten Variante (auch weil ich noch in Delphi programmiere ...</p>
</blockquote>
<p>Das scheint mir das Problem zu sein: Du hast Dich an eine Schwäche von Dephi gewöhnt und nun scheint es Dir komplizierter, es besser zu machen, als weiterhin schlechter..... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>DeSoVoDaMu schrieb:</p>
<blockquote>
<p>...<br />
2) Wenn ich die Schriftgrösse aendern moechte, muesste ich ja im Prinzip wieder eine neue Schrift erzeugen, wenn ich keine Create Methode habe (also auch dynamisch)....</p>
</blockquote>
<p>Du könntest auch eine &quot;changeSize()&quot;-Funktion spendieren. Damit drückst Du dann aus, dass eine Font seine Größe ändern kann. Ohne &quot;setter&quot; sagst Du aus, dass Name und Groesse &quot;Identifizierende&quot; Deines Fonts sind - sprich: Andere Größe =&gt; Anderer Font ! und da liegt nichts näher, als dass man auch ein neues Objekt anlegt.</p>
<p>Mir scheint aber Blue-Tigers Hinweis schon wichtig: Evtl. hast Du noch eine Designschwäche - es klingt mi danach, als bräuchtest Du neben dem Font noch einen FontCreator, der Initfiles interpretiert und entsprechende Fonts erzeugt.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1262954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1262954</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 10 Apr 2007 12:46:59 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt &amp;quot;initialisieren&amp;quot; on Tue, 10 Apr 2007 12:48:12 GMT]]></title><description><![CDATA[<p>Ja hehe, mir ging es einfach darum, dass ich ja auch ohne grossen Aufwand die Zeiger-Sache umgehen kann. Ich frage ja auch nur, weil mich so ein wenig dieses &quot;schlechte Design&quot;-Gefuehl gequaelt hat ^^<br />
Aber dann werde ich es jetzt immer ohne Create-Methode oder aehnlichem machen.</p>
<p>Oder was haltet Ihr von der 2. Idee mit der internen Create Methode?</p>
<pre><code class="language-cpp">class Font
{
private:
  m_font;

  CreateFont(name, size)
  {
    m_font = OSFunktionZumErstellenEinerSchrift(name, size);
  }

public:
  Font(name, size)
  {
    CreateFont(name, size);
  }

  SetSize(new_size)
  {
    CreateFont(name /*ja, muss irgendwo gespeichert werden*/, new_size);
  }
};
</code></pre>
<p>Gruss,<br />
DeSoVoDaMu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1262959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1262959</guid><dc:creator><![CDATA[DeSoVoDaMu]]></dc:creator><pubDate>Tue, 10 Apr 2007 12:48:12 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt &amp;quot;initialisieren&amp;quot; on Tue, 10 Apr 2007 13:01:31 GMT]]></title><description><![CDATA[<p>Was du intern machst, ist ja dir überlassen, das betrifft ja nicht mehr den User der Klasse. Das ist ja das Tolle an OOD, das man internas einfach private machen kann. public ist da eher wichtiger.</p>
<p>Klar kannst du jetzt hier noch fragen, ob auch die internas gut gemacht sind... und es ist so vom Prinzip her auch i.O.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1262969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1262969</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Tue, 10 Apr 2007 13:01:31 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt &amp;quot;initialisieren&amp;quot; on Tue, 10 Apr 2007 13:02:56 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class Font {
public:
   Font(string name = &quot;Arial&quot;, int size = 12) : m_name(name), m_size(size) {
      m_h = OSCreateFontFunc(m_name, m_size);
   }
   void change(int size){
      m_size = size;
      change_font();
   }
   void change(string name){
      m_name = name;
      change_font();
   }
private:
   void change_font(){
     m_h = OSCreateFontFunc(m_name, m_size)
   }

   String m_name;
   int m_size;
   FONTHANDLER m_h;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1262971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1262971</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Tue, 10 Apr 2007 13:02:56 GMT</pubDate></item></channel></rss>