<?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[private bleibt wirkungslos]]></title><description><![CDATA[<p>Hallo,<br />
Ich versuche gerade mich wieder in C++ einzuarbeiten, dazu habe ich in Anlehnung an &quot;Volkard's Kurs&quot; gerade die Rational Klasse erstellt. Die Klasse stellt eine Bruchzahl dar und es geht um das ueberladen von Operatoren.</p>
<pre><code>// rational.h
/*
//*/
#ifndef RATIONAL
#define RATIONAL

class Rational
{
private:
    int m_zaehler;
    int m_nenner;
    // ...

public:
    Rational(int zaehler, int nenner);
    Rational operator*(Rational rhs);
    // ...
};
#endif
</code></pre>
<p>Die Funktion operator* habe ich folgendermassen geschrieben:</p>
<pre><code>Rational Rational::operator*(Rational rhs)
{
    int resultZaehler = m_zaehler * rhs.m_zaehler;
    int resultNenner = m_nenner * rhs.m_nenner;
    Rational result(resultZaehler, resultNenner);
    return result;
};
</code></pre>
<p>Soweit sogut, in einer main() kann ich das ganze testen und es funktioniert - aber warum? rhs.m_nenner und rhs.m_zaehler duerften doch als &quot;private&quot; deklariert, eigentlich gar nicht zugaenglich sein, oder? Habe ich etwas bei der &quot;private&quot; Deklaration falsch gemacht?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/167794/private-bleibt-wirkungslos</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 05:09:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/167794.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 14 Dec 2006 22:56:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to private bleibt wirkungslos on Thu, 14 Dec 2006 22:56:31 GMT]]></title><description><![CDATA[<p>Hallo,<br />
Ich versuche gerade mich wieder in C++ einzuarbeiten, dazu habe ich in Anlehnung an &quot;Volkard's Kurs&quot; gerade die Rational Klasse erstellt. Die Klasse stellt eine Bruchzahl dar und es geht um das ueberladen von Operatoren.</p>
<pre><code>// rational.h
/*
//*/
#ifndef RATIONAL
#define RATIONAL

class Rational
{
private:
    int m_zaehler;
    int m_nenner;
    // ...

public:
    Rational(int zaehler, int nenner);
    Rational operator*(Rational rhs);
    // ...
};
#endif
</code></pre>
<p>Die Funktion operator* habe ich folgendermassen geschrieben:</p>
<pre><code>Rational Rational::operator*(Rational rhs)
{
    int resultZaehler = m_zaehler * rhs.m_zaehler;
    int resultNenner = m_nenner * rhs.m_nenner;
    Rational result(resultZaehler, resultNenner);
    return result;
};
</code></pre>
<p>Soweit sogut, in einer main() kann ich das ganze testen und es funktioniert - aber warum? rhs.m_nenner und rhs.m_zaehler duerften doch als &quot;private&quot; deklariert, eigentlich gar nicht zugaenglich sein, oder? Habe ich etwas bei der &quot;private&quot; Deklaration falsch gemacht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1192120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192120</guid><dc:creator><![CDATA[Fabeltier]]></dc:creator><pubDate>Thu, 14 Dec 2006 22:56:31 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Thu, 14 Dec 2006 23:13:11 GMT]]></title><description><![CDATA[<p>Hi Fabeltier<br />
solange du dich in deiner klasse befindest das du durch die beiden :: ausdrueckst</p>
<pre><code class="language-cpp">Rational Rational::operator*(Rational rhs)
</code></pre>
<p>kannst du auch auf deine privat member zugreifen. Sobald du aber ausserhalb deiner Klasse versuchst darauf zuzugreifen z.b in deiner Main durch</p>
<pre><code class="language-cpp">Rational r;
cout&lt;&lt;r.m_zaehler&lt;&lt;endl;
</code></pre>
<p>wird dir der Compiler ne abfuhr erteilen und sagen, dass m_zaehler privat ist.</p>
<p>MFG<br />
chewbo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1192127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192127</guid><dc:creator><![CDATA[chewbo]]></dc:creator><pubDate>Thu, 14 Dec 2006 23:13:11 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Fri, 15 Dec 2006 00:23:19 GMT]]></title><description><![CDATA[<p>Interessant,<br />
Ich dachte, das &quot;rhs&quot; zwar vom selben Typ ist, aber dennoch als fremdes Objekt angesehen werden muesste. Der operator*() ist ja hier nur Bestandteil von soz. &quot;lhs&quot; und &quot;rhs&quot; waere somit fremd. Nja, werd damit wohl noch etwas rumspielen muessen. Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1192140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192140</guid><dc:creator><![CDATA[Fabeltier]]></dc:creator><pubDate>Fri, 15 Dec 2006 00:23:19 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Fri, 15 Dec 2006 03:53:03 GMT]]></title><description><![CDATA[<p>Kam mir auch irgendwie konmisch vor, dass man scheinbar ueber ein Objekt einer Klasse auf private Elemente eines anderen Objekts dieser Klasse zugreifen kann.</p>
<p>Kann man die eigentlich auch noch aendern (falls man aus versehen nicht als const uebergibt)?</p>
<p>Irgendwie dachte ich, es sei logischer, nur das Objekt selbst und nicht Objekte der gleichen Klasse koennten auf private zugreifen. Aber dann wuerde man wohl Probleme mit de copyconstructor kriegen...</p>
<p>Komisch finde ich, dass das z.B auch in Bruce Eckels Thinking in C++ nicht erwaehnt wird. Oder hab ichs ueberlesen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1192155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192155</guid><dc:creator><![CDATA[Shinja]]></dc:creator><pubDate>Fri, 15 Dec 2006 03:53:03 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Fri, 15 Dec 2006 06:49:50 GMT]]></title><description><![CDATA[<p>Shinja schrieb:</p>
<blockquote>
<p>Kann man die eigentlich auch noch aendern (falls man aus versehen nicht als const uebergibt)?</p>
</blockquote>
<p>Ja kann man. Wieso ist das komisch? Es wird doch nicht per Objekt gekapselt sondern auf Klassenebene.</p>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1192169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192169</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Fri, 15 Dec 2006 06:49:50 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Fri, 15 Dec 2006 10:08:52 GMT]]></title><description><![CDATA[<p>David hat das ganz gut zusammengefasst:</p>
<p>Die Kapselung bezieht sich auf die Klasse, nicht auf das Objekt.</p>
<p>Du BRAUCHST diese Möglichkeit für Operatorüberladung, Kopierkonstruktor und Vergleichsmethoden, möglicherweise auch noch an anderen Stellen.</p>
<p>Das ist also durchaus beabsichtigt und kein Fehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1192284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192284</guid><dc:creator><![CDATA[Sid2K6]]></dc:creator><pubDate>Fri, 15 Dec 2006 10:08:52 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Fri, 15 Dec 2006 12:52:19 GMT]]></title><description><![CDATA[<p>Gut danke, der Hinweis mit der Klassenebene laesst mich da klarer durchblicken - das hatte ich vorher wohl falsch (Objektebene) verstanden. :xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1192436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192436</guid><dc:creator><![CDATA[Fabeltier]]></dc:creator><pubDate>Fri, 15 Dec 2006 12:52:19 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Fri, 15 Dec 2006 14:04:05 GMT]]></title><description><![CDATA[<p>Für protected ist der Schutz allerdings auch auf Objektebene. Du kannst nur this-&gt;protectedMember benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1192485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192485</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 15 Dec 2006 14:04:05 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Fri, 15 Dec 2006 14:29:24 GMT]]></title><description><![CDATA[<p>Nein, Optimizer,<br />
auch andere Methoden der gleichen Klasse (sogar statische Methoden der Klasse) können mittels eines Objektzeigers auf protected Elemente des Objekts zugreifen (denn wenn es schon für private geht, dann für protected erst recht!).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1192501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192501</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Fri, 15 Dec 2006 14:29:24 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Fri, 15 Dec 2006 19:43:47 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13046">@Fabeltier</a></p>
<p>Es ist zwar kein Muss, aber du solltest binäre Operatoren besser auf Namensraumebene überladen und nicht auf Klassenebene.</p>
<pre><code class="language-cpp">class Rational
{
    //...
};

Rational operator*(const Rational&amp; lhs, const Rational&amp; rhs)
{
    //...
}
</code></pre>
<p>Und sofern der Zugriff auf private Member notwendig ist, muss noch eine friend Deklaration innerhalb der Klasse stehen.</p>
<pre><code class="language-cpp">class Rational
{
    //...
    friend Rational operator*(const Rational&amp; lhs, const Rational&amp; rhs);
    //...
};
</code></pre>
<p>Das hat den Vorteil, dass hier Konstruktoren für _beide_ Operanden implizit herangezogen werden können, bei der Klassenimplementation ist das nur beim rechten Operand der Fall. Und normalerweise will man ja, dass sowohl 'a op b' als auch 'b op a' funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1192660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192660</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Fri, 15 Dec 2006 19:43:47 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Fri, 15 Dec 2006 20:02:29 GMT]]></title><description><![CDATA[<p>Shinja schrieb:</p>
<blockquote>
<p>Kam mir auch irgendwie konmisch vor, dass man scheinbar ueber ein Objekt einer Klasse auf private Elemente eines anderen Objekts dieser Klasse zugreifen kann.</p>
<p>Kann man die eigentlich auch noch aendern (falls man aus versehen nicht als const uebergibt)?</p>
<p>Irgendwie dachte ich, es sei logischer, nur das Objekt selbst und nicht Objekte der gleichen Klasse koennten auf private zugreifen. Aber dann wuerde man wohl Probleme mit de copyconstructor kriegen...</p>
<p>Komisch finde ich, dass das z.B auch in Bruce Eckels Thinking in C++ nicht erwaehnt wird. Oder hab ichs ueberlesen?</p>
</blockquote>
<p>Wie meine Vorredner, hier noch ein Beispiel, um zu verdeutlich, wie ungünstig eine Kapselung auf Objektebene wäre:</p>
<pre><code class="language-cpp">class Foo
{
    int foo_;
public:
// ...
    int select_foo(const Foo&amp; other) const
    {
        const Foo&amp; r = rand() % 2 ? *this : other;
        return r.foo_;
    }
};
</code></pre>
<p>Offensichtlich könnte eine Verletzung auf Objektebene nur während der Laufzeit festgestellt werden und auch dann müsste man prüfen, ob nicht other zufällig auf dasselbe Objekt wie *this verweist. Jedenfalls ist eine Prüfung zur Laufzeit statt beim Compilieren etwas, dass wir gerade vermeiden wollen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1192680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192680</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 15 Dec 2006 20:02:29 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Fri, 15 Dec 2006 21:47:53 GMT]]></title><description><![CDATA[<p>Soweit müsste man gar nicht gehen. Private/protected Zugriff auf Objektebene würde in C++ nur Sinn machen, wenn man prüft, ob ein Member zu this gehört oder nicht. In deinem Fall gehört foo_ zu r und müsste somit einen Compilerfehler verursachen. Die Laufzeitbindung von r ist daher nicht wirklich entscheidend.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1192730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192730</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Fri, 15 Dec 2006 21:47:53 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Sat, 16 Dec 2006 01:52:12 GMT]]></title><description><![CDATA[<p>@ groovemaster:<br />
Danke, das Ueberladen von Operatoren ausserhalb der Klassendeklaration kam in den weiteren Kapiteln <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="😉"
    /> und soweit ich mich noch erinnern kann an frueher, war das ja auch eine der wenigen &quot;sinnvollen&quot; Anwendungen von friend Deklarationen (soweit bin ich mom aber noch nicht) - gut, aber damit nerv ich dann in anderen Posts. Soweit so gut - vielen Dank fuer die Erklaerungen zum Thema &quot;private&quot;!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1192784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192784</guid><dc:creator><![CDATA[Fabeltier]]></dc:creator><pubDate>Sat, 16 Dec 2006 01:52:12 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Sat, 16 Dec 2006 06:00:00 GMT]]></title><description><![CDATA[<p>Ich danke ebenfalls. Wahrscheinlich ist es den meisten Leuten sofort ersichtlich gewesen als Anfänger, dass private eben für alle Objekte dieser Klasse gilt (eben Klassenbezogen) Ich habe da nicht genug drüber nachgedacht und hab intuitiv private als Objektbezogen interpretiert.</p>
<p>Naja, habs dann ja später durch Copyconstructor und co rausgefunden. Bin aber froh, dass es mir wenigstens nicht alleine so ergangen ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1192807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192807</guid><dc:creator><![CDATA[Shinja]]></dc:creator><pubDate>Sat, 16 Dec 2006 06:00:00 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Sat, 16 Dec 2006 09:39:24 GMT]]></title><description><![CDATA[<p>Wenn da so <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>
<pre><code class="language-cpp">const Rational operator*(const Rational&amp; lhs, const Rational&amp; rhs);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1192839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192839</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 16 Dec 2006 09:39:24 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Sat, 16 Dec 2006 16:41:37 GMT]]></title><description><![CDATA[<p>Freak_Coder schrieb:</p>
<blockquote>
<p>Wenn da so <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>
<pre><code class="language-cpp">const Rational operator*(const Rational&amp; lhs, const Rational&amp; rhs);
</code></pre>
</blockquote>
<p>Begründung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193015</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 16 Dec 2006 16:41:37 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Sat, 16 Dec 2006 17:00:33 GMT]]></title><description><![CDATA[<p>Freak_Coder schrieb:</p>
<blockquote>
<p>Wenn da so <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>
<pre><code class="language-cpp">const Rational operator*(const Rational&amp; lhs, const Rational&amp; rhs);
</code></pre>
</blockquote>
<p>Durchaus möglich, mache ich meistens auch so. Ist aber keinesfalls zwingend. Genauso wenig wie die Argumente per Referenz zu übergeben. Alexandrescu hat zB mal was dazu geschrieben. Es ging hier ja lediglich um das Prinzip zwischen Klassen- und Namensraumüberladung von binären Operatoren. Die letztendliche Implementation hängt sowieso vom jeweiligen Szenario ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193020</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Sat, 16 Dec 2006 17:00:33 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Sat, 16 Dec 2006 21:07:56 GMT]]></title><description><![CDATA[<p>groovemaster schrieb:</p>
<blockquote>
<p>Soweit müsste man gar nicht gehen. Private/protected Zugriff auf Objektebene würde in C++ nur Sinn machen, wenn man prüft, ob ein Member zu this gehört oder nicht. In deinem Fall gehört foo_ zu r und müsste somit einen Compilerfehler verursachen. Die Laufzeitbindung von r ist daher nicht wirklich entscheidend.</p>
</blockquote>
<p>Es ist doch das selbe Objekt. r und this haben die selbe Adresse, zeigen auf den selben Speicherbereich, also sind es die selben Objekte. Es wird ja kein neues Objekt, sondern nur ein Alias für das selbe Objekt erzeugt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193113</guid><dc:creator><![CDATA[DEvent]]></dc:creator><pubDate>Sat, 16 Dec 2006 21:07:56 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Sat, 16 Dec 2006 21:23:30 GMT]]></title><description><![CDATA[<p>groovemaster schrieb:</p>
<blockquote>
<p>Genauso wenig wie die Argumente per Referenz zu übergeben. Alexandrescu hat zB mal was dazu geschrieben.</p>
</blockquote>
<p>Warte mal. Alexandrescu bezog sich dabei auf eine Kopiersemantik. D.h. (wenn Du das gleiche meinst wie ich, wovon ich aber ausgehe) er hat keineswegs irgendwo geschrieben, dass man Argumente nicht per Referenz übergeben sollte -- außer für den Fall, dass man sie danach eh kopiert. Folgender Code ist natürlich ein wenig unsinnig:</p>
<pre><code class="language-cpp">void foo(T const&amp; v)
{
    T tmp = v; // Kopie
    // ...
}
</code></pre>
<p>Dann hätte man nämlich gleich eine Kopie übergeben können. Aber ansonsten sollte man bei non-PODs durchaus immer Referenzen verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193121</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sat, 16 Dec 2006 21:23:30 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Sat, 16 Dec 2006 22:04:12 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/5021">@Konrad</a><br />
Ja, das meinte ich. Aber mir ist nicht ganz klar, worauf du hinaus willst. Dein Beitrag steht doch in keinem Widerspruch zu meiner Aussage. Richtlinien sind nunmal nicht zwingend oder implizieren Allgemeingültigkeit.</p>
<p>DEvent schrieb:</p>
<blockquote>
<p>Es ist doch das selbe Objekt. r und this haben die selbe Adresse, zeigen auf den selben Speicherbereich, also sind es die selben Objekte. Es wird ja kein neues Objekt, sondern nur ein Alias für das selbe Objekt erzeugt.</p>
</blockquote>
<p>Ich habe ja auch nicht gesagt, dass das, was camper geschrieben hat, falsch ist. Das Beispiel widerstrebt nur dem Design von C++, also dem statischen Typsystem und der daraus resultierenden statischen Fehlerbehandlung. Und auf der Basis, also wo Laufzeitbindung eine Rolle spielt, kann man eben keinen Memberzugriff auf Objektebene spezifizieren. Alles was bleibt, ist der Sichtbarkeitsbereich. Und dort spielt die Laufzeitbindung dann keine Rolle mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193141</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Sat, 16 Dec 2006 22:04:12 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Sun, 17 Dec 2006 15:17:04 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Begründung?</p>
</blockquote>
<p>Damit zB sowas nicht möglich ist:</p>
<pre><code class="language-cpp">Rational a,b,c;
//...
a*b = c;
</code></pre>
<p>Bei einem nicht-Konstanten Rückgabewert würde dies funktionieren...<br />
Aber ich denke mal du weißt das schon und willst mich jetzt eines besseren Belehren <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1193497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193497</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 17 Dec 2006 15:17:04 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Sun, 17 Dec 2006 16:53:18 GMT]]></title><description><![CDATA[<p>Freak_Coder schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Begründung?</p>
</blockquote>
<p>Damit zB sowas nicht möglich ist:</p>
<pre><code class="language-cpp">Rational a,b,c;
//...
a*b = c;
</code></pre>
<p>Bei einem nicht-Konstanten Rückgabewert würde dies funktionieren...</p>
</blockquote>
<blockquote>
<p>Aber ich denke mal du weißt das schon und willst mich jetzt eines besseren Belehren <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>
</blockquote>
<p>Keineswegs. Ich meine, die Frage, ob man ein derartiges Konstrukt überhaupt verhindern muss, sollte jeder selbst entscheiden. Ich habe selten das Bedürfnis, so etwas zu schreiben.<br />
Wir können Vorkehrungen wegen Murphy treffen, aber gegen Machiavelli ist in C++ sowieso kein Kraut gewachsen.<br />
Immerhin, ein Konstruktion der Art</p>
<pre><code class="language-cpp">a*b*=c
</code></pre>
<p>an Stelle von</p>
<pre><code class="language-cpp">a*b*c
</code></pre>
<p>kann für eigene Typen durchaus sinnvoll sein, um ein paar unnötige Temporaries loszuwerden, und wir das ganze nicht gerade durch Expressiontemplates lösen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193561</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 17 Dec 2006 16:53:18 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Sun, 17 Dec 2006 17:04:01 GMT]]></title><description><![CDATA[<p>Es geht nicht darum sowas verhindern zu müssen, sondern sicherzustellen das man nicht versehentlich sowas schreibt. Fehler basieren darauf, das man es nciht mit Absicht macht. Wann immer der Compiler in der Lage ist solche Fehler anzumeckern hat man sich selber stundenlandes debuggen erspart.</p>
<p>Jeh genauer man die Bedingungen seiner Funktionen definiert (im Bezug auf public/private ebenso wie const correctness), desto mehr kann einem der Compiler dabei unterstützen Fehler zu verhindern. Für die reine Funktionalität sind die meisten dieser Sachen letzten Endes belanglos. Will sagen, Du kannst ebenso alles public machen und komplett auf const verzichten, laufen wird das Programm dann auch. Nur erhöhst Du damit die Chancen, daß Fehler unbemerkt bleiben... Bis sie dann in Produktion aufschlagen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193565</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 17 Dec 2006 17:04:01 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Sun, 17 Dec 2006 17:10:44 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Keineswegs. Ich meine, die Frage, ob man ein derartiges Konstrukt überhaupt verhindern muss, sollte jeder selbst entscheiden.</p>
</blockquote>
<p>Ja und wenn ich schon die Möglichkeit habe, solche Fehlerquellen zu ellimnieren, dann versuche ich es auch...</p>
<pre><code class="language-cpp">a*b*=c
</code></pre>
<p>Sowas finde ich unschön und das sieht ziemlich ungewoht aus <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 halt mich nur an das was Meyer in einem seiner Bücher mal geschrieben hat, ungefähr so: &quot;Benutzerdefinierte Typen sollten sich so wie eingebaute verhalten&quot;.</p>
<p>Und da dies bei int's und Konsorten auch nicht funktioniert, tue ich dies für meine Typen auch, schue hats eingentlich auf den Punkt gebracht.</p>
<p>Aber jedem seine Entscheidung ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193571</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 17 Dec 2006 17:10:44 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Sun, 17 Dec 2006 17:29:07 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich habe ja auch nicht gesagt, dass das, was camper geschrieben hat, falsch ist. Das Beispiel widerstrebt nur dem Design von C++, also dem statischen Typsystem und der daraus resultierenden statischen Fehlerbehandlung. Und auf der Basis, also wo Laufzeitbindung eine Rolle spielt, kann man eben keinen Memberzugriff auf Objektebene spezifizieren. Alles was bleibt, ist der Sichtbarkeitsbereich. Und dort spielt die Laufzeitbindung dann keine Rolle mehr.</p>
</blockquote>
<p>Ich versteh dich grade überhaupt nicht.</p>
<p>Camper hat gesagt, wenn man die Sichtbarkeit auf Objektebene regeln könnte, dann kann man erst zur Laufzeit entscheiden ob ein Member sichtbar ist oder nicht. Du hast gesagt das braucht man nicht, da r nicht this ist und somit die Sichtbarkeit zur Compilerzeit entschieden werden kann.</p>
<p>Aber r ist doch this. Ob eine Variable jetzt r oder this heißt ist doch egal, hauptsache sie zeigen beide auf den selben Speicherbereich und sind vom selben Typ.</p>
<p>Also müsstest du fordern das this eine spezielle Variable ist, die einzigartig ist.</p>
<pre><code class="language-cpp">int select_foo(const Foo&amp; foo1, const Foo&amp; foo2)
{
    const Foo&amp; r = rand() % 2 ? foo1 : foo2; 
    return r.foo_;
}
</code></pre>
<p>Wie willst du jetzt die Sichtbarkeit entscheiden?<br />
Edit: select_foo ist friend-Funktion der Klasse Foo.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193582</guid><dc:creator><![CDATA[DEvent]]></dc:creator><pubDate>Sun, 17 Dec 2006 17:29:07 GMT</pubDate></item><item><title><![CDATA[Reply to private bleibt wirkungslos on Sun, 17 Dec 2006 23:46:45 GMT]]></title><description><![CDATA[<p>DEvent schrieb:</p>
<blockquote>
<p>Camper hat gesagt, wenn man die Sichtbarkeit auf Objektebene regeln könnte, dann kann man erst zur Laufzeit entscheiden ob ein Member sichtbar ist oder nicht. Du hast gesagt das braucht man nicht, da r nicht this ist und somit die Sichtbarkeit zur Compilerzeit entschieden werden kann.</p>
</blockquote>
<p>Nein, hier bringst du was durcheinander. camper brachte ein Beispiel, was zeigt, wie man Zugriff auf Objektebene unter C++ nicht realisieren kann. Mein Punkt war lediglich der, dass dies unter C++ sowieso nicht zur Debatte steht, weil es nicht zum Konzept von C++ passt. Das einzige was man unter C++ machen kann, ist, den Zugriff auf Objektebene über den Sichtbarkeitsbereich zu regeln, anstatt sich auf Objektidentität zu versteifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193764</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Sun, 17 Dec 2006 23:46:45 GMT</pubDate></item></channel></rss>