<?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[To point or not to point -- Designfrage]]></title><description><![CDATA[<p>Guten Morgen!</p>
<p>Während ich hier munter herumprogrammiere, stelle ich mir eine Frage: Für welche Variante würdet ihr euch in folgendem Falle entscheiden?</p>
<pre><code class="language-cpp">AddItem( Item* item );
AddItem( Item&amp; item );
</code></pre>
<p>AddItem() fügt den Zeiger von 'item' irgendeinem Container hinzu.</p>
<p>Ich frage deshalb, weil ich mir nicht ganz sicher bin, was für das öffentl. Interface sinniger ist. Muss ich einen Zeiger übergeben, könnte das doch eher zeigen, dass innerhalb der Funktion (oder Methode einer Klasse) eine Referenz behalten wird.</p>
<p>Der Nachteil ist, dass das natürlich nicht typensicher, aber vor allem auch ungültig sein kann (Null-Pointer).</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/254979/to-point-or-not-to-point-designfrage</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 05:44:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/254979.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 24 Nov 2009 01:15:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Tue, 24 Nov 2009 01:15:28 GMT]]></title><description><![CDATA[<p>Guten Morgen!</p>
<p>Während ich hier munter herumprogrammiere, stelle ich mir eine Frage: Für welche Variante würdet ihr euch in folgendem Falle entscheiden?</p>
<pre><code class="language-cpp">AddItem( Item* item );
AddItem( Item&amp; item );
</code></pre>
<p>AddItem() fügt den Zeiger von 'item' irgendeinem Container hinzu.</p>
<p>Ich frage deshalb, weil ich mir nicht ganz sicher bin, was für das öffentl. Interface sinniger ist. Muss ich einen Zeiger übergeben, könnte das doch eher zeigen, dass innerhalb der Funktion (oder Methode einer Klasse) eine Referenz behalten wird.</p>
<p>Der Nachteil ist, dass das natürlich nicht typensicher, aber vor allem auch ungültig sein kann (Null-Pointer).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812687</guid><dc:creator><![CDATA[StefanBo]]></dc:creator><pubDate>Tue, 24 Nov 2009 01:15:28 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Tue, 24 Nov 2009 01:22:15 GMT]]></title><description><![CDATA[<p>StefanBo schrieb:</p>
<blockquote>
<p>Muss ich einen Zeiger übergeben, könnte das doch eher zeigen, dass innerhalb der Funktion (oder Methode einer Klasse) eine Referenz behalten wird.</p>
</blockquote>
<p>Guter Punkt.</p>
<blockquote>
<p>Der Nachteil ist, dass das natürlich nicht typensicher</p>
</blockquote>
<p>Ist genausi Typsicher wie mit der Referenz.</p>
<p>StefanBo schrieb:</p>
<blockquote>
<p>aber vor allem auch ungültig sein kann (Null-Pointer).</p>
</blockquote>
<p>Ach guter Punkt.</p>
<p>Für mich ist klar Punkt1 wichtiger. Wenn ich mit Add mir keine Kopie des Objekts anlege, sondern das Objekt nur wo anmelde oder in eine intrusive list einknüpfe, mag ich mit einem Zeiger kenntlich machen, daß mein Objekt benutzt wird.<br />
Die Mehrheit wird aber den zweiten Punkt für wichtiger halten, weil das in einem Buch so steht (hab vergessen, in welchem).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812688</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 24 Nov 2009 01:22:15 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Tue, 24 Nov 2009 08:44:42 GMT]]></title><description><![CDATA[<p>StefanBo schrieb:</p>
<blockquote>
<p>...Muss ich einen Zeiger übergeben, könnte das doch eher zeigen, dass innerhalb der Funktion (oder Methode einer Klasse) eine Referenz behalten wird....</p>
</blockquote>
<p><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="😕"
    /><br />
Sorry, das verstehe ich nicht.</p>
<p><em>Für mich</em> ist ein Zeiger immer ein Hinweis darauf, dass auch 0 übergeben werden und/oder der Verweis &quot;verschoben&quot; werden darf (also mal auf dieses Objekt mal auf jenes verweist, der &quot;Verweis&quot; an sich aber erhalten bleibt).</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

using namespace std;

struct item { };

struct MyCont {
   mutable vector&lt;item*&gt; v;   
   void addItem(item* i) { v.push_back(i); }
   item*&amp; operator[](size_t i) const { return v[i]; }
};

void fill(MyCont&amp; c, item&amp; i) {
   // füllen
   c.addItem(0);
   c.addItem(&amp;i);
   c.addItem(new item);
}

void redirect(MyCont const&amp; c) {
   // Container selbst bleibt unverändert, Verweise werden &quot;umgehängt&quot;
   c[0] = c[1];
   c[1] = new item;
   delete c[2];
}

int main() {
   item i;
   MyCont c;

   fill(c, i);
   redirect(c);
   return 0;
}
</code></pre>
<p>Gruß,</p>
<p>Simon2.</p>
<p>P.S.: Kann mir jemand erklären, warum es <code>std::vector::operator[] const;</code> nur eine <code>const_reference</code> zurückgibt? Sehe ich irgendwie nicht ein...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812741</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 24 Nov 2009 08:44:42 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Tue, 24 Nov 2009 08:49:52 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>P.S.: Kann mir jemand erklären, warum es <code>std::vector::operator[] const;</code> nur eine <code>const_reference</code> zurückgibt? Sehe ich irgendwie nicht ein...</p>
</blockquote>
<p>Damit ein <code>const std::vector&lt;T&gt;</code> möglich ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812744</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 24 Nov 2009 08:49:52 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Tue, 24 Nov 2009 08:59:16 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>P.S.: Kann mir jemand erklären, warum es <code>std::vector::operator[] const;</code> nur eine <code>const_reference</code> zurückgibt? Sehe ich irgendwie nicht ein...</p>
</blockquote>
<p>Weil std::vector::operator[] <strong>const</strong> sonst gar nicht const wär.<br />
std::vector::operator[] gibt auch reference zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812754</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Tue, 24 Nov 2009 08:59:16 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Tue, 24 Nov 2009 09:20:57 GMT]]></title><description><![CDATA[<p>brotbernd schrieb:</p>
<blockquote>
<p>Simon2 schrieb:</p>
<blockquote>
<p>P.S.: Kann mir jemand erklären, warum es <code>std::vector::operator[] const;</code> nur eine <code>const_reference</code> zurückgibt? Sehe ich irgendwie nicht ein...</p>
</blockquote>
<p>Weil std::vector::operator[] <strong>const</strong> sonst gar nicht const wär....</p>
</blockquote>
<p>Erste Reaktion:<br />
Wieso nicht?<br />
Für mich ändert ein <em>Container</em> nicht automatisch seinen Zustand, wenn sich der Zustand <em>eines seiner Element</em> ändert...</p>
<p>Zweite (nach ein wenig Nachdenken):<br />
Was wäre, wenn &quot;operator[]() const&quot; eine &quot;nonconst_reference&quot; zurück<em>gäbe</em>:</p>
<pre><code class="language-cpp">struct item {
   int i;
};

void f(vector&lt;item&gt; const&amp; v) {
   ++(v[0].i); // wäre ja (Arbeitshypothese) erlaubt
}

int main() {
   vector&lt;item&gt; v1, v2;

   v1.push_back(item());
   v2 = v1;
   f(v1);

   if(v1 == v2) cout &lt;&lt; &quot;dies würde ich erwarten&quot;;
   else cout &lt;&lt; &quot;dies würde ich (bei bisheriger Definition des operator==()) erhalten&quot;;
...
</code></pre>
<p>OK - ist wenigstens konsistent umgesetzt und je länger ich drüber nachdenke, desto schwerer fällt mir, eine konsistente Umsetzung meines &quot;Containerverständnisses&quot; zu entwerfen.</p>
<p>Ist wohl schon richtig so.</p>
<p>Danke,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812764</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 24 Nov 2009 09:20:57 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Tue, 24 Nov 2009 10:46:03 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p><em>Für mich</em> ist ein Zeiger immer ein Hinweis darauf, dass auch 0 übergeben werden und/oder der Verweis &quot;verschoben&quot; werden darf</p>
</blockquote>
<p>Genau deshalb frage ich ja. <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="🙂"
    /> Mich interessiert, wie andere das sehen, also welches Verhalten angenommen wird, wenn im Parameter ein Zeiger oder eine Referenz auftaucht.</p>
<p>Nehmen wir Folgendes an:</p>
<pre><code class="language-cpp">std::list&lt;const Item*&gt;  _cont;

void AddItem( const Item&amp; item ) {
  _cont.push_back( &amp;item );
}
</code></pre>
<p>Ich finde das zeigt, dass so was hier fast schon erwünscht ist:</p>
<pre><code class="language-cpp">AddItem( Item( ... ) );
</code></pre>
<p>Daher einfach die Verständnisfrage.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/106">@volkard</a>:<br />
Genau darüber dachte ich auch nach, also über das Kenntlichmachen, dass da mit Referenzen intern gespielt wird. Ansonsten würde mir nur einfallen, eine passende Zeile mit in die Dokumentation zu quetschen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812795</guid><dc:creator><![CDATA[StefanBo]]></dc:creator><pubDate>Tue, 24 Nov 2009 10:46:03 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Tue, 24 Nov 2009 12:18:49 GMT]]></title><description><![CDATA[<p>StefanBo schrieb:</p>
<blockquote>
<p>Genau darüber dachte ich auch nach, also über das Kenntlichmachen, dass da mit Referenzen intern gespielt wird. Ansonsten würde mir nur einfallen, eine passende Zeile mit in die Dokumentation zu quetschen.</p>
</blockquote>
<p>Definitiv die passende Zeile in die Doku. Bei einer nonconst-Referenz kann man nicht davon ausgehen, dass sie <em>nicht</em> im Objekt gespeichert wird, und ein Zeiger ist noch lange kein Hinweis darauf, <em>dass</em> eine Referenz auf das Argument im Objekt gespeichert wird. Da gibts keine allgemeingültigen Coding-Styles.</p>
<p>Dass eine Referenz nicht null ist, ist in der Sprache verankert, damit kann man also sicherstellen dass auch immer ein Objekt übergeben wird. Dangling references mal ausgenommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812834</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 24 Nov 2009 12:18:49 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Tue, 24 Nov 2009 14:08:33 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Dass eine Referenz nicht null ist, ist in der Sprache verankert, damit kann man also sicherstellen dass auch immer ein Objekt übergeben wird.</p>
</blockquote>
<p>Aber diese Regel hat evtl keinen Nutzwert, wie ich feststellen darf, weil ich sie konsequent nicht befolge. Es ist nämlich auch so klar, wann 0 übergeben werden darf und wann nicht.</p>
<p>Außerdem habe ich die zweite Regel selber neulich (14.10.09) angewandt, wie ich jetzt verblüfft feststellen muß.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812889</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 24 Nov 2009 14:08:33 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Tue, 24 Nov 2009 14:06:13 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Dass eine Referenz nicht null ist, ist in der Sprache verankert, damit kann man also sicherstellen dass auch immer ein Objekt übergeben wird.</p>
</blockquote>
<p>Aber diese Regel hat evtl keinen Nutzwert, wie ich feststellen darf, weil ich sie konsequent nicht befolge. Es ist nämlich auch so klar, wann 0 übergeben werden darf und wann nicht.</p>
</blockquote>
<p><strong>boost.ptr_container</strong> ist da aber ein gutes Gegenbeispiel. Ohne Doku impliziert das Interface, dass NULL übergeben werden darf. Darf es aber so erstmal nicht. Erst, wenn man das Template-Argument entsprechend Vorbereitet ist es möglich. Aber &quot;so klar&quot; ist das nicht.<br />
Wie stellst Du es denn klar, wenn ich Fragen darf?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812891</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 24 Nov 2009 14:06:13 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Tue, 24 Nov 2009 14:11:54 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Wie stellst Du es denn klar, wenn ich Fragen darf?</p>
</blockquote>
<p>Es bedarf keiner gesonderten Klarstellung. Ich habe gar kein Verlangen, 0 zu übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812897</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 24 Nov 2009 14:11:54 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Tue, 24 Nov 2009 21:42:53 GMT]]></title><description><![CDATA[<p>StefanBo schrieb:</p>
<blockquote>
<p>Simon2 schrieb:</p>
<blockquote>
<p><em>Für mich</em> ist ein Zeiger immer ein Hinweis darauf, dass auch 0 übergeben werden und/oder der Verweis &quot;verschoben&quot; werden darf</p>
</blockquote>
<p>Genau deshalb frage ich ja. <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="🙂"
    /> Mich interessiert, wie andere das sehen, also welches Verhalten angenommen wird, wenn im Parameter ein Zeiger oder eine Referenz auftaucht.</p>
<p>Nehmen wir Folgendes an:</p>
<pre><code class="language-cpp">std::list&lt;const Item*&gt;  _cont;

void AddItem( const Item&amp; item ) {
  _cont.push_back( &amp;item );
}
</code></pre>
<p>Ich finde das zeigt, dass so was hier fast schon erwünscht ist:</p>
<pre><code class="language-cpp">AddItem( Item( ... ) );
</code></pre>
<p>Daher einfach die Verständnisfrage.</p>
</blockquote>
<p>Ich finde die Regel, immer Referenzen zu übergeben, außer man benötigt Pointer-Eigenschaften, nützlich und wende sie möglichst immer an.</p>
<p>Nach meinem Verständnis ist allerdings die Möglichkeit, bei Übergabe von Pointern ohne Weiteres einen Verweis statt eine Kopie zu übernehmen, auch eine Pointer-Eigenschaft. Aus diesem Grunde würde ich nie AddItem() wie im Beispiel implementieren, sondern immer mit einem Pointer als Parameter. Dass kein Nullpointer übergeben werden darf, würde ich in diesem Fall dokumentieren und vielleicht noch die Funktion in TakeItem() (oder so) umbenennen.</p>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813118</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Tue, 24 Nov 2009 21:42:53 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Tue, 24 Nov 2009 22:13:51 GMT]]></title><description><![CDATA[<p>Ich halt mich an die Regel: &quot;wenn die Funktion die Daten veraendert, wird ein Pointer uebergeben&quot;.</p>
<p>Die Logik dahinter ist, dass beim Verwenden der Funktionen sofort sehe, was die Funktion macht:</p>
<pre><code class="language-cpp">do_something(&amp;foo);  // foo kann womoeglich veraendert werden
do_something(foo);   // foo wird nicht veraendert
</code></pre>
<p>Wenn kein Pointer uebergeben wird gehe ich davon aus dass entweder eine Kopie oder eine const Referenz uebergeben wird. Bei AddItem wuerde ich einen Pointer uebergeben. Ein Aufruf wie &quot;addItem(foo)&quot; schaut fuer mich so aus, als wuerde eine KOPIE von foo uebergeben, in Wirklichkeit ist dem ja aber nicht so.</p>
<p>Das &quot;ich kann auch null uebergeben&quot;-Argument find ich nicht so wichtig. In der Regel kann ich vom Funktionsnamen ableiten, ob null uebergeben werden kann oder nicht. Und in nicht-performance-kritischen Funktionen kann ich die Parameter auch von Hand auf null testen und reagieren (einfach ignorieren, oder ein assert() oder eine Exception... je nachdem was mehr Sinn macht).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813126</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Tue, 24 Nov 2009 22:13:51 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Wed, 25 Nov 2009 08:43:55 GMT]]></title><description><![CDATA[<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>Ich halt mich an die Regel: &quot;wenn die Funktion die Daten veraendert, wird ein Pointer uebergeben&quot;....</p>
</blockquote>
<p>Das heißt, &quot;non-const-Referenzen&quot; kommen bei Dir in Parameterlisten gar nicht vor?</p>
<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>...In der Regel kann ich vom Funktionsnamen ableiten, ob null uebergeben werden kann oder nicht. ...</p>
</blockquote>
<p>Kannst Du mal ein Beispiel geben? Ich kann mir gerade keinen &quot;organischen&quot; Funktionsnamen vorstellen, bei dem diese Eigenschaft eines bestimmten Parameters deutlich wird.</p>
<p>Die &quot;Ich-sehe-direkt-beim-Call-ob-ein-Parameter-geändert-wird&quot;-Strategie greift mir persönlich zu kurz (eigentlich heißt sie ja: &quot;Ich-beurteile-Veränderbarkeit-ohne-Funktionsdeklaration&quot;-Strategie <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>
<p>1.) Es gibt viel zu viele Ausnahmen - z.B.</p>
<pre><code class="language-cpp">struct A {
   //.... tausend Attribute
   int* a;
   int operator&amp;();
   //.... tausend weitere Attribute

};

A a;
f(a); // hoppla: hier sehe ich gar nicht mehr, dass A::a verändert werden könnte
g(&amp;a); // hoppla: Hier wird nur ein int übergeben und nichts verändert
</code></pre>
<p>Außerdem ist das eine Eigenschaft der <em>Funktion</em> und hängt weniger der übergebenen Variablen. Deswegen hängt man sowieso (und zu Recht) an der Funktionsdeklaration.</p>
<p>2.) Für die Frage der Veränderbarkeit gibt es das klar definierte Konstrukt &quot;const&quot; ... und das sollte man IMHO auch verwenden.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813186</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 25 Nov 2009 08:43:55 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Wed, 25 Nov 2009 13:26:32 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>Ich halt mich an die Regel: &quot;wenn die Funktion die Daten veraendert, wird ein Pointer uebergeben&quot;....</p>
</blockquote>
<p>Das heißt, &quot;non-const-Referenzen&quot; kommen bei Dir in Parameterlisten gar nicht vor?</p>
</blockquote>
<p>mal von swap abgesehen kommen bei mir non-const-Referenzen in Parameterlisten eigentlich auch nicht vor.</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>...In der Regel kann ich vom Funktionsnamen ableiten, ob null uebergeben werden kann oder nicht. ...</p>
</blockquote>
<p>Kannst Du mal ein Beispiel geben? Ich kann mir gerade keinen &quot;organischen&quot; Funktionsnamen vorstellen, bei dem diese Eigenschaft eines bestimmten Parameters deutlich wird.</p>
</blockquote>
<p>Ich würde viel eher gerne wissen, welchen Funktionen man natürlich 0 übergeben dürfen soll! Ich finde, kein indert, delete, remove, free, print, compare, find, unique, sort oder wasauchimmer muß erwarten, 0 übergeben zu bekommen.</p>
<blockquote>
<p>Die &quot;Ich-sehe-direkt-beim-Call-ob-ein-Parameter-geändert-wird&quot;-Strategie greift mir persönlich zu kurz (eigentlich heißt sie ja: &quot;Ich-beurteile-Veränderbarkeit-ohne-Funktionsdeklaration&quot;-Strategie <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>
</blockquote>
<p>Das Gegenteil ist der Fall! Beim Aufrufer sehe ich sofort und ohne Funktionsdeklaration, ob es bei diesem Aufruf Veränderungsprobleme geben kann. Die Regel ist nicht für den Schreiber da, sondern für den Leser. Und den Fehlersucher/Fehlervermeider.</p>
<blockquote>
<p>1.) Es gibt viel zu viele Ausnahmen - z.B.</p>
<pre><code class="language-cpp">struct A {
   //.... tausend Attribute
   int* a;
   int operator&amp;();
   //.... tausend weitere Attribute

};
A a;
f(a); // hoppla: hier sehe ich gar nicht mehr, dass A::a verändert werden könnte
g(&amp;a); // hoppla: Hier wird nur ein int übergeben und nichts verändert
</code></pre>
</blockquote>
<p>Vielleicht müßte a in Wirklichkeit pa heißen. Vielleicht müßte das Attribut private sein und es einen const-Getter geben. Wer weiß?</p>
<blockquote>
<p>Außerdem ist das eine Eigenschaft der <em>Funktion</em> und hängt weniger der übergebenen Variablen. Deswegen hängt man sowieso (und zu Recht) an der Funktionsdeklaration.</p>
</blockquote>
<p>Und es ist wichtig genug, beim Aufrufer zu stehen! Ganz im Gegensatz zur NullKannSeinBarkeit, die mangels Existenz auch nicht so arg relevant ist.</p>
<blockquote>
<p>2.) Für die Frage der Veränderbarkeit gibt es das klar definierte Konstrukt &quot;const&quot; ... und das sollte man IMHO auch verwenden.</p>
</blockquote>
<p>Das klingt wie &quot;Wenn der Herr geollt hätte, daß der Mensch fliegt, hätte er ihm Flügel wachsen lassen.&quot;. Unser Vorgehen unterstützt const doch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813299</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 25 Nov 2009 13:26:32 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Wed, 25 Nov 2009 15:18:57 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>...</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Kannst Du mal ein Beispiel geben? Ich kann mir gerade keinen &quot;organischen&quot; Funktionsnamen vorstellen, bei dem diese Eigenschaft eines bestimmten Parameters deutlich wird.</p>
</blockquote>
<p>Ich würde viel eher gerne wissen, welchen Funktionen man natürlich 0 übergeben dürfen soll! ...</p>
</blockquote>
<p>Das ist ja interessant.</p>
<p>Irgendwie beantwortet das meine Frage 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="😉"
    /><br />
Aber mal auf Deine Frage:</p>
<pre><code class="language-cpp">struct A {
   B* connectedWith;
   A(B* connectTo = 0) : connectedWith(connectTo) {}
};
</code></pre>
<p>Für mich steht aber auch nicht die &quot;Nullbarkeit&quot; im Mittelpunkt, sondern die &quot;Umhängbarkeit&quot; und die &quot;Optionalität&quot;.<br />
... und letztlich die (damit verbundene) lockerere Bindung zwischen 2 Objekten.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>...Beim Aufrufer sehe ich sofort und ohne Funktionsdeklaration, ob es bei diesem Aufruf Veränderungsprobleme geben kann. ...</p>
</blockquote>
<p>Die Wiederholung macht das Argument nicht besser - ich sage immer noch: Ohne Funktionsdeklaration wird man nur sehr (und für mich: <em>zu</em>) unzuverlässig etwas über die &quot;Änderungspläne&quot; einer Funktion herausbekommen.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>...Vielleicht müßte a in Wirklichkeit pa heißen. Vielleicht müßte das Attribut private sein und es einen const-Getter geben. Wer weiß?<br />
...</p>
</blockquote>
<p>Welche Relevanz hat das für den Schreiber von f()?<br />
(und wer sagt, was &quot;...müsste..&quot;? Das mit dem &quot;pa&quot; hast Du nicht ernst gemeint, oder?)</p>
<p>volkard schrieb:</p>
<blockquote>
<p>...Das klingt wie &quot;Wenn der Herr geollt hätte, daß der Mensch fliegt, hätte er ihm Flügel wachsen lassen.&quot;. Unser Vorgehen unterstützt const doch.</p>
</blockquote>
<p>Die Aussage ist aber genau anders herum: Wenn wir doch Flügel (const) haben - warum dann für Flugversuche mit den Armen (Pointer) wedeln?</p>
<p>Nochmal ein Beispiel:</p>
<pre><code class="language-cpp">T *************a;

f(**********a);
g(************a);
h(&amp;*******a);
</code></pre>
<p>welche Funktion ändert was?<br />
Was bedeutet eigentlich &quot;ändert den Parameter&quot;?<br />
Das kann man mit &quot;... * const * * const ....&quot; exakt und nachvollziehbar (&quot;wunderschön&quot; verkneife ich mir mal in dem Zusammenang) festlegen.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813386</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 25 Nov 2009 15:18:57 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Wed, 25 Nov 2009 15:46:01 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Aber mal auf Deine Frage:</p>
<pre><code class="language-cpp">struct A {
   B* connectedWith;
   A(B* connectTo = 0) : connectedWith(connectTo) {}
};
</code></pre>
<p>Für mich steht aber auch nicht die &quot;Nullbarkeit&quot; im Mittelpunkt, sondern die &quot;Umhängbarkeit&quot; und die &quot;Optionalität&quot;.<br />
... und letztlich die (damit verbundene) lockerere Bindung zwischen 2 Objekten.</p>
</blockquote>
<p>Ich benutze keine Default-Parameter.</p>
<pre><code class="language-cpp">struct A {
   B* connectedWith;
   A() : connectedWith(0) {}
   void connect(B* connectTo) {connectedWith=cw;}//hier natürlich zeiger und 0 nicht erlaubt
   A() : connectedWith(B* connectTo);//hier natürlich zeiger und 0 nicht erlaubt
};
</code></pre>
<p>Umhängbarkeit deckt sich zum Teil mit der genannten Nichtkopierbarkeit und zwingt beide Lager zum Zeiger. Die Optionalität verwende ich eigentlich nur bei Such-Rückgaben. Verwendete. Ich glaube, das mache ich auch nicht mehr, sondern gebe Ranges zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813401</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 25 Nov 2009 15:46:01 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Wed, 25 Nov 2009 16:05:41 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>...Ich benutze keine Default-Parameter. ...</p>
</blockquote>
<p>Ich auch eher selten (hier nur der Vollständigkeit halber und zur besseren Schnittstellendoku) - spielt aber keine Rolle in diesem Zusammenhang.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>...Umhängbarkeit deckt sich zum Teil mit der genannten Nichtkopierbarkeit und zwingt beide Lager zum Zeiger. ...</p>
</blockquote>
<p>Japp - das meinte ich.<br />
Und weil es genau diese Situation ist, die einem zum Zeiger zwingt, würde ich auch genau diesen Zusammenhang damit ausdrücken wollen - und das hat nichts mit &quot;Veränderbarkeit&quot; zu tun.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>...Ich glaube, das mache ich auch nicht mehr, sondern gebe Ranges zurück.</p>
</blockquote>
<p>bei &quot;find_first_element()&quot; auch nicht unbedingt praktisch ... <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="😉"
    /><br />
Aber da sprechen wir wohl auch nicht von Parametern sondern von Rückgabewerten.</p>
<p>Ich habe aber auch den Eindruck, dass Du hier diese Diskussion auf Dein spezielles Steckenpferd (&quot;non-const Referenzen braucht/nimmt man nicht&quot;) ausweitest - die will ich nicht führen und die erwartet der Threadersteller auch nicht.<br />
Wenn ich ihn recht verstehe, möchte er einen <em>Überblick</em> (also eher eine statistische Aussage) darüber, wieviele Leute seine Schnittstelle in welche Richtung interpretieren - und nicht die eine korrekte Antwort auf alle Fragen.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813413</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 25 Nov 2009 16:05:41 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Wed, 25 Nov 2009 19:14:30 GMT]]></title><description><![CDATA[<p><a href="http://www.c-plusplus.info/forum/viewtopic-var-t-is-231001.html" rel="nofollow">Déjà-Vu</a> <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="🙂"
    /></p>
<p>Ich handhabe Schnittstellen übrigens ähnlich wie Simon2. Aber was mich interessiert, ist, wieso ihr keine/kaum Default-Parameter verwendet?</p>
<p>Auch betreffend Nullzeiger: Bei mir kamen schon solche Funktionen vor, wenn auch sehr selten:</p>
<pre><code class="language-cpp">T DoSomething(const S&amp; input_param, U* output_param = 0);
</code></pre>
<p>Also dass <code>output_param</code> gewisse Zusatzinformationen speichern könnte, die den Aufrufer im Normalfall nicht interessieren. Falls doch, übergibt man der Funktion ein zweites Argument. Erachtet ihr so eine Vorgehensweise als schlechten Stil?</p>
<p>Ansonsten verwende ich Zeiger mit Möglichkeit zum Null-Sein in Schnittstellen, wenn ich optionale Attribute habe, also sowas wie</p>
<pre><code class="language-cpp">void Ship::SetTarget(Ship* Target);
</code></pre>
<p>Hast du das wirklich nie, volkard, oder gehst du immer Umwege über zusätzliche Methoden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813529</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 25 Nov 2009 19:14:30 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Wed, 25 Nov 2009 19:20:00 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">T DoSomething(const S&amp; input_param, U* output_param = 0);
</code></pre>
<p>Also dass <code>output_param</code> gewisse Zusatzinformationen speichern könnte, die den Aufrufer im Normalfall nicht interessieren. Falls doch, übergibt man der Funktion ein zweites Argument. Erachtet ihr so eine Vorgehensweise als schlechten Stil?</p>
</blockquote>
<p>Nein, finde ich nicht. Weil man ja nur in einem Sonderfall für diese Daten interessiert. Ich denke mal, dass du hier auf einen Intersect Algorithmus anspielst. Dort finde ich das nämlich sehr passend. In erster Linie ist man ja nur mal daran interessiert, ob sich 2 Objekte schneiden. Dann möchte man vielleicht noch wissen, wo das genau passiert. Dann ist der Parameter genau passend. Würde ich auch so machen. (Habe ich glaube ich sogar auch mal).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813534</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 25 Nov 2009 19:20:00 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Wed, 25 Nov 2009 19:28:06 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Ansonsten verwende ich Zeiger mit Möglichkeit zum Null-Sein in Schnittstellen, wenn ich optionale Attribute habe, also sowas wie</p>
<pre><code class="language-cpp">void Ship::SetTarget(Ship* Target);
</code></pre>
<p>Hast du das wirklich nie, volkard, oder gehst du immer Umwege über zusätzliche Methoden?</p>
</blockquote>
<p>Ich kann mich jetzt nicht erinnern, sowas zu haben.<br />
Ich nehme an, ich würde</p>
<pre><code class="language-cpp">void Ship::SetTarget(Ship* Target);
</code></pre>
<p>und</p>
<pre><code class="language-cpp">void Ship::ClearTarget();
</code></pre>
<p>haben.</p>
<p>Ich habe ja außen schon ein if, und dann brauche ich innen nicht auch noch eins. Ich fürchte, sowas mutiert.</p>
<pre><code class="language-cpp">void Ship::SetTarget(Ship* Target)
{
   if(Target==0)
   {//ClearTarget
      m_target=0;
      plan=HEALSELF|SEEKENEMY;
   }
   else
   {//SetTarget
      m_target=Target;
      plan=ATTACK;
   }
}
</code></pre>
<p>wird optimiert zu</p>
<pre><code class="language-cpp">void Ship::SetTarget(Ship* Target)
{
   if(Target==0)
   {//ClearTarget
      plan=HEALSELF|SEEKENEMY;
   }
   else
   {//SetTarget
      plan=ATTACK;
   }
   m_target=Target;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1813544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813544</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 25 Nov 2009 19:28:06 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Wed, 25 Nov 2009 19:50:05 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Nein, finde ich nicht. Weil man ja nur in einem Sonderfall für diese Daten interessiert. Ich denke mal, dass du hier auf einen Intersect Algorithmus anspielst.</p>
</blockquote>
<p>Danke für die Antwort. Stimmt, Intersection wäre ein gutes Beispiel, ich habe jetzt nicht einmal konkret daran gedacht.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>Ich habe ja außen schon ein if, und dann brauche ich innen nicht auch noch eins. Ich fürchte, sowas mutiert.</p>
</blockquote>
<p>Innen braucht man ja nur eine If-Abfrage, wenn man mehr als eine <code>Target</code> -Zuweisung macht. Was meinst du genau mit aussen?</p>
<p>Bei einer einzelnen Funktion kann dafür die Anwendung leichter sein:</p>
<pre><code class="language-cpp">MyShip.SetTarget(AlliedShip.GetTarget());
</code></pre>
<p>v.s.</p>
<pre><code class="language-cpp">Ship* Target = AlliedShip.GetTarget();
if (Target == 0)
    MyShip.ClearTarget();
else
    MyShip.SetTarget(Target);
</code></pre>
<p>Hier würdest du ja kaum speziell abfragen (sowas wie <code>bool HasTarget() const</code> ), oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813556</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 25 Nov 2009 19:50:05 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Wed, 25 Nov 2009 20:21:42 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Was meinst du genau mit aussen?</p>
</blockquote>
<p>Ich gehe davon aus, daß der Aufrufer weiß, ob SetTarget(0) oder SetTarget(echtesDing) gemacht wird.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Bei einer einzelnen Funktion kann dafür die Anwendung leichter sein</p>
</blockquote>
<p>Jo, wäre denkbar. Aber ich kann mir nicht vorstellen, daß ich die leicher anwendbare Version übersehen hätte, wenn sowas bei mir vorgekommen wäre.</p>
<pre><code class="language-cpp">MyShip.SetTarget(AlliedShip.GetTarget());
</code></pre>
<p>Da steckt evtl eine Bedeutungsüberladung drin, m_target!=0 heißt zugleich, daß das Schiff im Angriffsmodus ist. Ich schätze, davor hätte ich Angst und würde den Modus woanders scpeichern und genau dann, wenn Modus==ANGRIFF, dann ist m_target definiert. Evtl wäre m_target auch nur ein Attribut eines AngriffsPlan-Objekts und nicht immer optionales Schiffsattribut. Ich tue mir mit optionalen Attributen recht schwer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813568</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 25 Nov 2009 20:21:42 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Wed, 25 Nov 2009 20:22:05 GMT]]></title><description><![CDATA[<p>Mir ist klar dass meine Konvention nur eine von vielen moeglichen ist, aber fuer mich hat sie bisher eigentlich immer funktioniert und erleichtert das Code-Lesen. <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="😉"
    /><br />
Allerdings gebe ich dir Recht, manchmal hantiert man mit rohen Pointern (eben weil man NULL benoetigt), und dann passierts, dass man Funktionen Pointern uebergibt, obwohl diese ihren Parameter gar nicht veraendern (War aber fuer mich Persoenlich noch nie ein Problem).</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>Ich halt mich an die Regel: &quot;wenn die Funktion die Daten veraendert, wird ein Pointer uebergeben&quot;....</p>
</blockquote>
<p>Das heißt, &quot;non-const-Referenzen&quot; kommen bei Dir in Parameterlisten gar nicht vor?</p>
</blockquote>
<p>In der Regel nicht, nein</p>
<blockquote>
<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>...In der Regel kann ich vom Funktionsnamen ableiten, ob null uebergeben werden kann oder nicht. ...</p>
</blockquote>
<p>Kannst Du mal ein Beispiel geben? Ich kann mir gerade keinen &quot;organischen&quot; Funktionsnamen vorstellen, bei dem diese Eigenschaft eines bestimmten Parameters deutlich wird.</p>
</blockquote>
<p>addItem --&gt; NULL ist kein Item (sonderne eben die Abwesenheit davon), also macht addItem(NULL) auch keinen Sinn.<br />
processEntry --&gt; NULL ist kein Entry, also macht processEntry auch keinen Sinn.<br />
isValid --&gt; da koennte NULL Sinn machen.<br />
traverseTree -&gt; dito (da Blaetter ja in der Regel mit null abgespeichert werden)<br />
...</p>
<blockquote>
<p>Die &quot;Ich-sehe-direkt-beim-Call-ob-ein-Parameter-geändert-wird&quot;-Strategie greift mir persönlich zu kurz (eigentlich heißt sie ja: &quot;Ich-beurteile-Veränderbarkeit-ohne-Funktionsdeklaration&quot;-Strategie <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>
</blockquote>
<p>Solang sich jeder im Projekt an die Strategie haelt, funktionierts aber!</p>
<blockquote>
<p>1.) Es gibt viel zu viele Ausnahmen - z.B.</p>
<pre><code class="language-cpp">struct A {
   //.... tausend Attribute
   int* a;
   int operator&amp;();
   //.... tausend weitere Attribute

};

A a;
f(a); // hoppla: hier sehe ich gar nicht mehr, dass A::a verändert werden könnte
g(&amp;a); // hoppla: Hier wird nur ein int übergeben und nichts verändert
</code></pre>
</blockquote>
<p>Ich geb zu das ist mir noch nie passiert. Aber solang ich mich an die &quot;Wenn die Funktion was aendert, wird als Pointer uebergeben&quot; Regel halte, gaebe es den Aufruf f(a) nur dann, wenn f A::a nicht veraendert. Und operator&amp; hab ich eigentlich noch nie ueberladen.</p>
<blockquote>
<p>2.) Für die Frage der Veränderbarkeit gibt es das klar definierte Konstrukt &quot;const&quot; ... und das sollte man IMHO auch verwenden.</p>
</blockquote>
<p>Wenn ich Code ueberfliege hab ich die Deklaration aber selten so genau im Kopf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813569</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Wed, 25 Nov 2009 20:22:05 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Thu, 26 Nov 2009 14:26:06 GMT]]></title><description><![CDATA[<p>Hi Blue-Tiger,</p>
<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>Simon2 schrieb:</p>
<blockquote>
<p>......In der Regel kann ich vom Funktionsnamen ableiten, ob null uebergeben werden kann oder nicht. ...</p>
</blockquote>
<p>Kannst Du mal ein Beispiel geben? Ich kann mir gerade keinen &quot;organischen&quot; Funktionsnamen vorstellen, bei dem diese Eigenschaft eines bestimmten Parameters deutlich wird.</p>
</blockquote>
<p>addItem --&gt; NULL ist kein Item (sonderne eben die Abwesenheit davon), also macht addItem(NULL) auch keinen Sinn.<br />
processEntry --&gt; NULL ist kein Entry, also macht processEntry auch keinen Sinn.<br />
isValid --&gt; da koennte NULL Sinn machen.<br />
traverseTree -&gt; dito (da Blaetter ja in der Regel mit null abgespeichert werden)<br />
...</p>
</blockquote>
<p>Also für mich ist das aber alles Andere als klar: 0 ist oft genug Stellvertreter für &quot;ungültiges Objekt&quot;.<br />
So wie string::npos auch keine &quot;Position&quot; ist und iterator::end() auch kein &quot;Iterator&quot; (im Sinne von &quot;man kann mit ihnen alles machen, was man mit einem ... machen kann&quot;).</p>
<p>Ich wäre bei den o.g. Funktionsnamen niemals darauf gekommen, dass (aufgrund der Namen) kein 0 erlaubt wäre - wo ist denn in dieser Hinsicht der Unterschied zwischen &quot;addItem&quot; und &quot;isValidItem&quot; ?<br />
Außerdem setzt das eine intensive Auseinandersetzung mit den fachlichen Hintergründen voraus (wie z.B. dass bei einem Tree die Blätter mit 0 abgelegt werden) und ein gleiches Verständnis desselben voraus (Man könnte auch einen Tree implementieren, für die Blattobjekte von einem eigenen Typ sind - oder jedes Element ein entsprechendes Flag hat....).<br />
Und selbst wenn das bei der Implementierung reichlich bekannter technischer Strukturen noch funktionieren mag, wird das Ganze bei komplexer Fachlichkeit nicht mehr intuitiv.<br />
Mir scheint es in diesem Fall andersherum zu sein:<br />
- Weil Du weißt/denkst/vermutest, dass 0 in diesem Zusammenhang nicht sinnvoll ist, ...<br />
- ... findest Du auch die Funktionsnamen sprechend.<br />
Aber für den Fall, in dem &quot;jeder sowieso weiß, wie's funktioniert&quot; braucht man gar keine Konvention. <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>
<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>...</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Die &quot;Ich-sehe-direkt-beim-Call-ob-ein-Parameter-geändert-wird&quot;-Strategie greift mir persönlich zu kurz (eigentlich heißt sie ja: &quot;Ich-beurteile-Veränderbarkeit-ohne-Funktionsdeklaration&quot;-Strategie <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>
</blockquote>
<p>Solang sich jeder im Projekt an die Strategie haelt, funktionierts aber!</p>
</blockquote>
<p>Das wäre mir eine deutlich zu wackelige Angelegenheit - Projekte altern und wachsen, Mitarbeiter lernen und wechseln die Projekte, ...</p>
<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>...<br />
Ich geb zu das ist mir noch nie passiert. Aber solang ich mich an die &quot;Wenn die Funktion was aendert, wird als Pointer uebergeben&quot; Regel halte, gaebe es den Aufruf f(a) nur dann, wenn f A::a nicht veraendert. ...</p>
</blockquote>
<p>Ich sehe immer noch nicht den Vorteil oder Mehrwert ggü. der Verwendung von const.</p>
<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>...<br />
Und operator&amp; hab ich eigentlich noch nie ueberladen....</p>
</blockquote>
<p>Ic auch nicht ... kann aber passieren und da hast Du als Programmierer von f() nicht unbedingt Einfluß drauf.<br />
Noch &quot;schlimmer&quot; wird's ja dadurch, dass der Begriff &quot;Pointer&quot; ja ziemlich verwischt durch Iteratoren, Smart_Pointer, ... und natürlich durch die Möglichkeit, diese zu &quot;schachteln&quot;.<br />
Von welcher Form von &quot;Veränderung&quot; gehst Du denn aus bei</p>
<pre><code class="language-cpp">smart_pointer&lt;A&gt; a;
smart_pointer&lt;A&gt;** b;

f(a);
g(&amp;a);
h(*a);
i(*b);
j(**b);
k(&amp;*b);
...
</code></pre>
<p>?</p>
<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>...<br />
...Wenn ich Code ueberfliege hab ich die Deklaration aber selten so genau im Kopf.</p>
</blockquote>
<p>Das ist IMHO das eigentliche Problem. Sich aber stattdessen eine &quot;Eselsbrücke&quot; zu bauen, die noch unsicherer ist, halte ich aber nicht für eine Lösung.<br />
Andererseits sollte das in Zeiten morderne IDEs keine echte Schweirigkeit mehr darstellen - Maus drüber und schon siehst Du's.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813811</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 26 Nov 2009 14:26:06 GMT</pubDate></item><item><title><![CDATA[Reply to To point or not to point -- Designfrage on Thu, 26 Nov 2009 18:11:58 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Da steckt evtl eine Bedeutungsüberladung drin, m_target!=0 heißt zugleich, daß das Schiff im Angriffsmodus ist. Ich schätze, davor hätte ich Angst und würde den Modus woanders scpeichern und genau dann, wenn Modus==ANGRIFF, dann ist m_target definiert. Evtl wäre m_target auch nur ein Attribut eines AngriffsPlan-Objekts und nicht immer optionales Schiffsattribut. Ich tue mir mit optionalen Attributen recht schwer.</p>
</blockquote>
<p>Okay. Ich finde optionale Attribute recht nützlich, hatte auch noch nie wirklich Probleme damit. Aber es kann hier natürlich heikel werden, wenn es sich um mehr als einen simplen Setter handelt. Vielleicht würde ich dann auch sowas wie die Angriffsplan-Variante bevorzugen, kommt auf die besonderen Umstände an. Ich hätte aber kein grundsätzliches Problem mit einer einzigen Methode.</p>
<p>Eine ähnliche Sache, bei der eine Entscheidung zwischen einer oder zwei Memberfunktionen fällig ist:</p>
<pre><code class="language-cpp">bool Button::SetVisible(bool Visible);
// vs.
void Button::Show();
void Button::Hide();
</code></pre>
<p>Obwohl <code>Show()</code> und <code>Hide()</code> sprechender sind und in vielen Situationen direkt so vom User aufgerufen werden können, finde ich <code>SetVisible()</code> flexibler und würde wohl das einsetzen (ich gehe auch hier von einfachen Set-Funktionen aus). Falls sich herausstellt, dass man tatsächlich dauernd am explizit <code>true</code> oder <code>false</code> übergeben ist und das nicht schön findet, kann man ja immer noch zwei globale Funktionstemplates schreiben, die dann auf alle Klassen anwendbar sind, welche eine <code>SetVisible()</code> -Methode bereitstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1813932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1813932</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 26 Nov 2009 18:11:58 GMT</pubDate></item></channel></rss>