<?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[Frage zu Konstruktoren und Klassendesign]]></title><description><![CDATA[<p>Hi,</p>
<p>ich schreibe gerade eine Klasse und weiss nicht recht wie ich folgendes am besten loesen soll.</p>
<pre><code>class A
{
private:
    int _x;
    int _y;
public:
    A(int x, int y)
    {
        if ( x &gt; 255 ) 
            _x = 255;
        else
            _x = x;

        if ( y &gt; 255 ) 
            _y = 255;
        else
            _y = y;
    }

    A(int xy)
    {
       // 1. nochmal auf x und y &gt; 255 pruefen was redundant waere
       // 2. eine init methode schreiben die das macht
       // 3. den ersten Konstruktor hier aufrufen
    }
};
</code></pre>
<p>Diese Art von Problem kommt ja nun recht haeufig vor, also dass man Werte ueberpruefen muss und diese Werte einmal direkt dem Konstruktor zur Ueberpruefung gegeben werden und einmal dass die Werte indirekt von einem anderen Konstruktor erzeugt werden, aber auch geprueft werden soll.</p>
<p>Wie loest ihr sowas?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/321443/frage-zu-konstruktoren-und-klassendesign</link><generator>RSS for Node</generator><lastBuildDate>Tue, 21 Jul 2026 12:48:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/321443.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 11 Nov 2013 14:54:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Konstruktoren und Klassendesign on Mon, 11 Nov 2013 14:54:20 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich schreibe gerade eine Klasse und weiss nicht recht wie ich folgendes am besten loesen soll.</p>
<pre><code>class A
{
private:
    int _x;
    int _y;
public:
    A(int x, int y)
    {
        if ( x &gt; 255 ) 
            _x = 255;
        else
            _x = x;

        if ( y &gt; 255 ) 
            _y = 255;
        else
            _y = y;
    }

    A(int xy)
    {
       // 1. nochmal auf x und y &gt; 255 pruefen was redundant waere
       // 2. eine init methode schreiben die das macht
       // 3. den ersten Konstruktor hier aufrufen
    }
};
</code></pre>
<p>Diese Art von Problem kommt ja nun recht haeufig vor, also dass man Werte ueberpruefen muss und diese Werte einmal direkt dem Konstruktor zur Ueberpruefung gegeben werden und einmal dass die Werte indirekt von einem anderen Konstruktor erzeugt werden, aber auch geprueft werden soll.</p>
<p>Wie loest ihr sowas?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2364945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364945</guid><dc:creator><![CDATA[CppNeuland]]></dc:creator><pubDate>Mon, 11 Nov 2013 14:54:20 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktoren und Klassendesign on Mon, 11 Nov 2013 15:02:01 GMT]]></title><description><![CDATA[<p>mit C++11 kannst du aus einem Konstruktor einen anderen Konstruktor aufrufen, das wäre hier sicherlich sinnvoll.</p>
<p>Allerdings frage ich mich, was genau du hiermit meinst:</p>
<pre><code class="language-cpp">A(int xy)
    {
       // 1. nochmal auf x und y &gt; 255 pruefen was redundant waere
       // 2. eine init methode schreiben die das macht
       // 3. den ersten Konstruktor hier aufrufen
    }
</code></pre>
<p>du übergibst doch nur ein int... sind die zwei Werte irgendwie in das eine int reincodiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2364946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364946</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Mon, 11 Nov 2013 15:02:01 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktoren und Klassendesign on Mon, 11 Nov 2013 15:13:56 GMT]]></title><description><![CDATA[<p>Naja, wenn er meint, dass da nur Werte von 0 bis 255 drin stehen können, dann kann man die auch zu 4. in einen int reinschieben.</p>
<p>Aber ne Prüfung muss dann nicht mehr gemacht werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2364948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364948</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 11 Nov 2013 15:13:56 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktoren und Klassendesign on Mon, 11 Nov 2013 15:22:58 GMT]]></title><description><![CDATA[<p>daddy_felix schrieb:</p>
<blockquote>
<p>...</p>
<p>du übergibst doch nur ein int... sind die zwei Werte irgendwie in das eine int reincodiert?</p>
</blockquote>
<p>Ich denke er will x und y auf den Wert von xy setzen.</p>
<p>Also in etwa so</p>
<pre><code>class A 
{ 
private: 
    int _x; 
    int _y; 
public: 
    A(int x, int y) 
    { 
        if ( x &gt; 255 ) 
            _x = 255; 
        else 
            _x = x; 

        if ( y &gt; 255 ) 
            _y = 255; 
        else 
            _y = y; 
    } 

    A(int xy) : A(xy, xy)
    { 
       // 1. nochmal auf x und y &gt; 255 pruefen was redundant waere 
       // 2. eine init methode schreiben die das macht 
       // 3. den ersten Konstruktor hier aufrufen 
    } 
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2364949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364949</guid><dc:creator><![CDATA[Tobias Gerg]]></dc:creator><pubDate>Mon, 11 Nov 2013 15:22:58 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktoren und Klassendesign on Mon, 11 Nov 2013 15:42:59 GMT]]></title><description><![CDATA[<p>sollte das nicht eine Initializierung sein?<br />
also etwa so?</p>
<pre><code>A(int x, int y) 
 : _x (x &gt; 255 ? 255 : x) , _y (y &gt; 255 ? 255 : y)
    { 
    }
</code></pre>
<p>das &quot;x &gt; 255 ? 255 : x&quot; koennte natürlich auch eine Function sein.</p>
<pre><code>A(int x, int y) 
 : _x (rangeCheckd(x)) , _y (rangeCheckd(y))
    { 
    }
</code></pre>
<p>dann schaut es eventuell freundlicher aus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2364953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364953</guid><dc:creator><![CDATA[kurze_frage]]></dc:creator><pubDate>Mon, 11 Nov 2013 15:42:59 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktoren und Klassendesign on Mon, 11 Nov 2013 15:48:06 GMT]]></title><description><![CDATA[<p>Ja, richtig, ich wollte in dem zweiten Konstruktor mit xy sowohl x als auch y initialisieren und natuerlich vorher wieder den Bereich pruefen. Aber es sollte nur ein Beispiel fuer die Problematik sein, mir ist da auf die schnelle nix besseres eingefallen.</p>
<p>Es geht also generell darum, Werte auf Gueltigkeit zu pruefen und verschiedene Konstruktoren zur Verfuegung zu stellen, die dann eventuell auch dieselben Tests durchlaufen muessen(Datei nicht gefunden, ausserhalb des Bereiches, ungueltige Daten, etc.).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2364954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364954</guid><dc:creator><![CDATA[CppNeuland]]></dc:creator><pubDate>Mon, 11 Nov 2013 15:48:06 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktoren und Klassendesign on Mon, 11 Nov 2013 16:11:17 GMT]]></title><description><![CDATA[<p>kurze_frage schrieb:</p>
<blockquote>
<p>das &quot;x &gt; 255 ? 255 : x&quot; koennte natuerlich auch eine Function sein.</p>
<pre><code>A(int x, int y) 
 : _x (rangeCheckd(x)) , _y (rangeCheckd(y))
    { 
    }
</code></pre>
<p>dann schaut es eventuell freundlicher aus</p>
</blockquote>
<p>Ist das nicht ein Problem? Also, Methoden aufzurufen, obwohl das Objekt in der Initialisierungsliste noch nicht vollstaendig konstruiert wurde? Gibt das nicht eventuell undefiniertes Verhalten?</p>
<p>Wie loest ihr das denn immer? extra-init Funktion? Ueber das neue C11 Feature?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2364957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364957</guid><dc:creator><![CDATA[CppNeuland]]></dc:creator><pubDate>Mon, 11 Nov 2013 16:11:17 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktoren und Klassendesign on Mon, 11 Nov 2013 16:14:04 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Ich haette 3 Fragen.</p>
<p>1. Was sind x und y wo kommen die Werte her?<br />
2. Kannst du die Daten nicht vorher validieren?<br />
3. Du weisst das x und y bei dir theoretisch zwischen -2147483648 und 255 liegen koennen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2364958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364958</guid><dc:creator><![CDATA[Ruvi]]></dc:creator><pubDate>Mon, 11 Nov 2013 16:14:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktoren und Klassendesign on Mon, 11 Nov 2013 16:26:55 GMT]]></title><description><![CDATA[<p>CppNeuland schrieb:</p>
<blockquote>
<p>Ist das nicht ein Problem? Also, Methoden aufzurufen, obwohl das Objekt in der Initialisierungsliste noch nicht vollstaendig konstruiert wurde? Gibt das nicht eventuell undefiniertes Verhalten?</p>
</blockquote>
<p>Nein, das ist ok.<br />
Die rangeCheckd-Funktion nutzt ja nichtmal member-Variablen.</p>
<p>(Vorsicht, Halbwissen):<br />
Geht auch mit Memberfunktionen, die nur Variablen nutzen, die in der Klassendeklaration vor der zu initialisierenden Variablen stehen.<br />
Da würde ich allerdings warten, bis das hier einer bestätigt (oder widerlegt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2364959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364959</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Mon, 11 Nov 2013 16:26:55 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktoren und Klassendesign on Mon, 11 Nov 2013 16:38:23 GMT]]></title><description><![CDATA[<p>Ruvi schrieb:</p>
<blockquote>
<p>Hi,</p>
<p>Ich haette 3 Fragen.</p>
<p>1. Was sind x und y wo kommen die Werte her?<br />
2. Kannst du die Daten nicht vorher validieren?<br />
3. Du weisst das x und y bei dir theoretisch zwischen -2147483648 und 255 liegen koennen?</p>
</blockquote>
<p>Das war nur ein konstruiertes Beispiel. Daten die einer Klasse bei der Konstruktion uebergeben werden, sollten meiner Meinung nach in der Klasse selbst auf Gueltigkeit geprueft werden, da jede Klasse fuer ihre Daten selbst verantwortlich sein sollte.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/23734">@Jockelx</a>: Ok, also wenn die check_range Methode wirklich nur diesen Parameter bearbeitet, macht es nix aus. Gut zu wissen.</p>
<p>P.S.: Es ist wirklich sehr anstrengend hier immer nur ohne Sonderzeichen posten zu koennen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2364960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364960</guid><dc:creator><![CDATA[CppNeuland]]></dc:creator><pubDate>Mon, 11 Nov 2013 16:38:23 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktoren und Klassendesign on Mon, 11 Nov 2013 17:18:20 GMT]]></title><description><![CDATA[<p>CppNeuland schrieb:</p>
<blockquote>
<p>Das war nur ein konstruiertes Beispiel. Daten die einer Klasse bei der Konstruktion uebergeben werden, sollten meiner Meinung nach in der Klasse selbst auf Gueltigkeit geprueft werden, da jede Klasse fuer ihre Daten selbst verantwortlich sein sollte.</p>
</blockquote>
<p>Edit:<br />
Also ich persoenlich hatte den Fall den du beschreibst noch nicht.</p>
<p>Ich persoenlich finde auch, dass der Owner der das Objekt erzeugt dafuer zustaendig ist fuer valide Werte zu sorgen.</p>
<p>Den Konstruktor auf &quot;gut Glueck&quot; aufzurufen und sich die Werte dann im Notfall hinzuschummeln ist vielleicht nicht so zielfuehrend.</p>
<p>Mich wuerde schon interessieren wie das andere machen<br />
.<br />
Ich persoenlich habe bis jetzt von einer Value &quot;Ueberpruefung&quot; im Konstruktor immer abgesehen denn:</p>
<p>1. Musst du von irgendwoher erstmal einen nicht validen Wert erhalten.<br />
2. Musst du auch erstmal in der Lage sein zu erkennen, dass es ein nicht valider Wert ist.<br />
3. Biegst du den Wert auf etwas anderes um, was im Zweifel trotzdem nicht das ist, was der Nutzer eigentlich wollte bzw. mit dem dein Programm einfach weiterarbeiten kann ohne Folgefehler zu verursachen.</p>
<p>P.S.:<br />
Natuerlich ist jede Klasse fuer ihre Daten verantwortlich aber die x und y Werte in deinem Fall kommen nicht von deiner Klasse A.<br />
An der Stelle wo du die x und y Werte berechnest oder bzw. wem die x und y Werte vorher gehoerten sollte die Validierung stattfinden. (nach meiner Meinung)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2364961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364961</guid><dc:creator><![CDATA[Ruvi]]></dc:creator><pubDate>Mon, 11 Nov 2013 17:18:20 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktoren und Klassendesign on Mon, 11 Nov 2013 17:38:18 GMT]]></title><description><![CDATA[<p>Unter anderem deswegen wurden doch auch Getter und Setter eingefuehrt, damit man eben nicht einfach den Werten von aussen vertraut wird, sondern damit sie vorher einen Check durchlaufen. Nur wuerde ich ungernen, nach dem erst die Instanz erzeugt wurde, durch Setter meiner Daten in die Members schreiben lassen, sondern dies gleich bei der Generierung machen lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2364969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364969</guid><dc:creator><![CDATA[CppNeuland]]></dc:creator><pubDate>Mon, 11 Nov 2013 17:38:18 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktoren und Klassendesign on Mon, 11 Nov 2013 18:01:11 GMT]]></title><description><![CDATA[<p>CppNeuland schrieb:</p>
<blockquote>
<p>kurze_frage schrieb:</p>
<blockquote>
<p>das &quot;x &gt; 255 ? 255 : x&quot; koennte natuerlich auch eine Function sein.</p>
<pre><code>A(int x, int y) 
 : _x (rangeCheckd(x)) , _y (rangeCheckd(y))
    { 
    }
</code></pre>
<p>dann schaut es eventuell freundlicher aus</p>
</blockquote>
<p>Ist das nicht ein Problem? Also, Methoden aufzurufen, obwohl das Objekt in der Initialisierungsliste noch nicht vollstaendig konstruiert wurde? Gibt das nicht eventuell undefiniertes Verhalten?</p>
<p>Wie loest ihr das denn immer? extra-init Funktion? Ueber das neue C11 Feature?</p>
</blockquote>
<p>das ist kein Problem, genau genommen ist rangeCheckd sogar eine const expression und sollte daher eigentlich ungefähr so</p>
<pre><code>template &lt;typename T &gt; constexpr
T rangeCheckd(T val, T max) { return val &gt; max ? max : val ;}

 A(int x, int y) 
 : _x (rangeCheckd(x,255)) , _y (rangeCheckd(y,255))
    { 
    }
</code></pre>
<p>aussehen, dann is es auch wiederverwendbarer.</p>
<p>Syntax Korrektheit kann ich im Moment nicht garantieren da ich das jetzt nur so schnell hingeschrieben hab, aber ich denke das Konzept sollte klar sein.</p>
<p>edit:<br />
eigentlich wollt ich rangeCheckd&lt;255&gt;(x) syntax, aber das sample war so falsch das ich es änderte</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2364970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364970</guid><dc:creator><![CDATA[kurze_frage]]></dc:creator><pubDate>Mon, 11 Nov 2013 18:01:11 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktoren und Klassendesign on Mon, 11 Nov 2013 18:00:33 GMT]]></title><description><![CDATA[<p>kurze_frage schrieb:</p>
<blockquote>
<pre><code>template &lt;typename T , T max&gt; constexpr
T rangeCheckd(T val) { return val &gt; max ? max : val ;}

 A(int x, int y) 
 : _x (rangeCheckd&lt;255&gt;(x)) , _y (rangeCheckd&lt;255&gt;(y))
    { 
    }
</code></pre>
<p>aussehen, dann is es auch wiederverwendbarer.</p>
</blockquote>
<p>lol? Warum max als Template-Argument?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2364974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364974</guid><dc:creator><![CDATA[crunchexpr]]></dc:creator><pubDate>Mon, 11 Nov 2013 18:00:33 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktoren und Klassendesign on Mon, 11 Nov 2013 18:02:21 GMT]]></title><description><![CDATA[<p>crunchexpr schrieb:</p>
<blockquote>
<p>kurze_frage schrieb:</p>
<blockquote>
<pre><code>template &lt;typename T , T max&gt; constexpr
T rangeCheckd(T val) { return val &gt; max ? max : val ;}

 A(int x, int y) 
 : _x (rangeCheckd&lt;255&gt;(x)) , _y (rangeCheckd&lt;255&gt;(y))
    { 
    }
</code></pre>
<p>aussehen, dann is es auch wiederverwendbarer.</p>
</blockquote>
<p>lol? Warum max als Template-Argument?</p>
</blockquote>
<p>du warst zu schnell, siehe edit kommentar in meinem post</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2364975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364975</guid><dc:creator><![CDATA[kurze_frage]]></dc:creator><pubDate>Mon, 11 Nov 2013 18:02:21 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Konstruktoren und Klassendesign on Mon, 11 Nov 2013 23:38:06 GMT]]></title><description><![CDATA[<p>Ist denn das Range-Checken und das finale Verwenden in der Anwendungslogik in der selben Klasse?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2365037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2365037</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 11 Nov 2013 23:38:06 GMT</pubDate></item></channel></rss>