<?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[Class -&amp;gt; friend oder nicht]]></title><description><![CDATA[<p>also angenommen ich habe eine Klasse in etwa so:</p>
<pre><code class="language-cpp">class Matrix
{
private:
	unsigned int Spalten, Zeilen;
	vector &lt; vector &lt; double &gt; &gt; values;
public:
	Matrix (void);
	~Matrix (void);
	unsigned int GetSpalten (void) const {return Spalten;};
	unsigned int GetZeilen (void) const {return Zeilen;};

	unsigned int SetSpalten (unsigned int spalten) {Spalten = spalten;};
	unsigned int SetZeilen (unsigned int zeilen) {Zeilen = zeilen;};

	void GetCeil (unsigned int spalte, unsigned int zeile, double value) const;
	void SetCeil (unsigned int spalte, unsigned int zeile, double value);
//... blablabla
};
</code></pre>
<p>Wann ist es besser, den operator als friend zu deklarieren und wann nicht?</p>
<p>Also:</p>
<pre><code class="language-cpp">friend operator == (Matrix &amp; matrix2);
</code></pre>
<pre><code class="language-cpp">bool operator == (Matrix &amp; matrix2);
</code></pre>
<p>Danke schon mal ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/204560/class-gt-friend-oder-nicht</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 16:27:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/204560.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 04 Feb 2008 19:17:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Class -&amp;gt; friend oder nicht on Mon, 04 Feb 2008 19:20:12 GMT]]></title><description><![CDATA[<p>also angenommen ich habe eine Klasse in etwa so:</p>
<pre><code class="language-cpp">class Matrix
{
private:
	unsigned int Spalten, Zeilen;
	vector &lt; vector &lt; double &gt; &gt; values;
public:
	Matrix (void);
	~Matrix (void);
	unsigned int GetSpalten (void) const {return Spalten;};
	unsigned int GetZeilen (void) const {return Zeilen;};

	unsigned int SetSpalten (unsigned int spalten) {Spalten = spalten;};
	unsigned int SetZeilen (unsigned int zeilen) {Zeilen = zeilen;};

	void GetCeil (unsigned int spalte, unsigned int zeile, double value) const;
	void SetCeil (unsigned int spalte, unsigned int zeile, double value);
//... blablabla
};
</code></pre>
<p>Wann ist es besser, den operator als friend zu deklarieren und wann nicht?</p>
<p>Also:</p>
<pre><code class="language-cpp">friend operator == (Matrix &amp; matrix2);
</code></pre>
<pre><code class="language-cpp">bool operator == (Matrix &amp; matrix2);
</code></pre>
<p>Danke schon mal ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449316</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 04 Feb 2008 19:20:12 GMT</pubDate></item><item><title><![CDATA[Reply to Class -&amp;gt; friend oder nicht on Mon, 04 Feb 2008 22:49:30 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>op== würde ich als friend, also global implementieren, da somit auch implizite Umwandlung möglich sind. ( was aber ehe nicht bei deiner Matrix geht )</p>
<p>Bsp.:</p>
<pre><code class="language-cpp">class A {
    private:
            int x;
    public:
            A(int p) : x(p) { }
            bool operator(const A&amp; a) { return obj.x == x; }
};

A a1(4),a2(3);
a1==a2; // funktioniert
a1==4;  // funktioniert, 4 wird implizit mit Hilfe von A(int) umgewandelt ( kann mit explicit verhindert werden)
4==a1;  // ohh, funktioniert nicht. Es gibt kein int.op==(A) und auch kein op==(int,A)
</code></pre>
<p>Also machen wir uns nen globales friend:</p>
<pre><code class="language-cpp">class A {
    private:
            int x;
    public:
            A(int p) : x(p) { }
            friend bool operator(const A&amp; a, const A&amp; b);
};

bool operator(const A&amp; a, const A&amp; b) { return a.x == b.x; }

A a1(4),a2(3);
a1==a2; // funktioniert
a1==4;  // funktioniert
4==a1;  // funktioniert
</code></pre>
<p>Wäre auch möglich mal int als erstes und int als zweiten Param. zu schreiben bei op== aber da wir die Hilfe des Konvertierungskonstruktors haben, brauchen wir das nicht.</p>
<p>Allgeimein: Implementiere Vergleichsoperatoren ( ==, !=, &lt;, &gt;, &lt;= ...) immer global, sowie auch op+ op- op/ op* und implementiere diese wiederum mit op+= etc.<br />
D.h. Modifizierende Operatoren in der Klasse nicht modifizierende außerhalb ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449405</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449405</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 04 Feb 2008 22:49:30 GMT</pubDate></item><item><title><![CDATA[Reply to Class -&amp;gt; friend oder nicht on Mon, 04 Feb 2008 22:58:18 GMT]]></title><description><![CDATA[<p>KasF schrieb:</p>
<blockquote>
<p>Allgeimein: Implementiere Vergleichsoperatoren ( ==, !=, &lt;, &gt;, &lt;= ...) immer global, sowie auch op+ op- op/ op* und implementiere diese wiederum mit op+= etc.<br />
D.h. Modifizierende Operatoren in der Klasse nicht modifizierende außerhalb ...</p>
</blockquote>
<p>Interessanterweise erspart man sich dann meistens sogar das &quot;friend&quot;. Warum es sich trotzdem eingebürgert hat? Den einzigen syntaktischen Vorteil, den ich dann noch sehe, ist bei der Deklaration von template-Operatoren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449408</guid><dc:creator><![CDATA[davie]]></dc:creator><pubDate>Mon, 04 Feb 2008 22:58:18 GMT</pubDate></item><item><title><![CDATA[Reply to Class -&amp;gt; friend oder nicht on Mon, 04 Feb 2008 23:02:13 GMT]]></title><description><![CDATA[<p>davie schrieb:</p>
<blockquote>
<p>Interessanterweise erspart man sich dann meistens sogar das &quot;friend&quot;. Warum es sich trotzdem eingebürgert hat? Den einzigen syntaktischen Vorteil, den ich dann noch sehe, ist bei der Deklaration von template-Operatoren.</p>
</blockquote>
<p>Ja, da hast du Recht. Ich wollte aber DIE friend-Geschichte nicht in dieser friend-Geschichte erzählen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449409</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 04 Feb 2008 23:02:13 GMT</pubDate></item><item><title><![CDATA[Reply to Class -&amp;gt; friend oder nicht on Mon, 04 Feb 2008 23:11:06 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1731">@davie</a>: Hmm was hat man da wohl noch für nen Vorteil ... man betrachte Sichtbarkeiten usw ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449410</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449410</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Mon, 04 Feb 2008 23:11:06 GMT</pubDate></item><item><title><![CDATA[Reply to Class -&amp;gt; friend oder nicht on Mon, 04 Feb 2008 23:13:36 GMT]]></title><description><![CDATA[<p>davie schrieb:</p>
<blockquote>
<p>Interessanterweise erspart man sich dann meistens sogar das &quot;friend&quot;. Warum es sich trotzdem eingebürgert hat? Den einzigen syntaktischen Vorteil, den ich dann noch sehe, ist bei der Deklaration von template-Operatoren.</p>
</blockquote>
<p>Weil es den Operator in offensichtlicher Weise dem Interface der Klasse zuordnet?<br />
Zudem erlaubt es die Definition der Funktion innerhalb der Klassendefinition (dabei spart man sogar noch ein inline).<br />
Und dann ist da noch das Namelookup...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449411</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 04 Feb 2008 23:13:36 GMT</pubDate></item><item><title><![CDATA[Reply to Class -&amp;gt; friend oder nicht on Tue, 05 Feb 2008 00:03:53 GMT]]></title><description><![CDATA[<p>Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449422</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 05 Feb 2008 00:03:53 GMT</pubDate></item><item><title><![CDATA[Reply to Class -&amp;gt; friend oder nicht on Tue, 05 Feb 2008 00:14:27 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>davie schrieb:</p>
<blockquote>
<p>Interessanterweise erspart man sich dann meistens sogar das &quot;friend&quot;. Warum es sich trotzdem eingebürgert hat? Den einzigen syntaktischen Vorteil, den ich dann noch sehe, ist bei der Deklaration von template-Operatoren.</p>
</blockquote>
<p>Weil es den Operator in offensichtlicher Weise dem Interface der Klasse zuordnet?</p>
</blockquote>
<p>punkt für dich. aber das kann ich auch anders ausdrücken (mit einem eigenen header für die klasse und ihr zugehörige funktionen z.b.)</p>
<blockquote>
<p>Zudem erlaubt es die Definition der Funktion innerhalb der Klassendefinition (dabei spart man sogar noch ein inline).</p>
</blockquote>
<p>da liegt doch wohl der hauptvorteil eher darin, dass man sich den operator als template erspart (was allerdings auch oft sehr verwirrend sein kann, wenn man denkt, einen template-operator definiert zu haben, der in wahrheit kein template ist)</p>
<blockquote>
<p>Und dann ist da noch das Namelookup...</p>
</blockquote>
<p>worauf genau beziehst du dich jetzt? namelookup der namen in der friend deklaration? ist doch auch eher unintuitiv.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449428</guid><dc:creator><![CDATA[davie]]></dc:creator><pubDate>Tue, 05 Feb 2008 00:14:27 GMT</pubDate></item><item><title><![CDATA[Reply to Class -&amp;gt; friend oder nicht on Tue, 05 Feb 2008 00:19:10 GMT]]></title><description><![CDATA[<p>Hmm naja wofür gibt es normalerweise eine friend-Beziehung? Er bezieht sich da auf das selbe, das ich auch angemerkt habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449431</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Tue, 05 Feb 2008 00:19:10 GMT</pubDate></item><item><title><![CDATA[Reply to Class -&amp;gt; friend oder nicht on Tue, 05 Feb 2008 01:37:41 GMT]]></title><description><![CDATA[<p>Ich spam mal gleich hier weiter, hab gerad noch nen mir völlig unbegreifliches Problem...</p>
<p>Ich nutze VS (und Win XP)</p>
<pre><code class="language-cpp">//HEADER - hab ich aber wieder mit in die *.cpp reingemacht, weil ich dachte, dass ich da vll iwas verhauen hätte -.-
//includes (vector, iterator, iostream + ne helper.cpp, die mir paar Aufgaben abnimmt

typedef std::vector &lt;double&gt; row;
typedef std::vector&lt;row&gt;::const_iterator cit_row;
typedef std::vector&lt;row&gt;::iterator it_row;
typedef row::const_iterator cit_ceil;
typedef row::iterator it_ceil;

class MyMatrix
{
	private:
		unsigned int Spalten, Zeilen;
		std::vector &lt; row &gt; values;
		bool ok;
	public:
		MyMatrix (void);
		MyMatrix (bool init);
		MyMatrix (const MyMatrix &amp; matrix);
		~MyMatrix (void);
		unsigned int GetSpalten (void) const {return Spalten;};
		unsigned int GetZeilen (void) const {return Zeilen;};

		void SetSpalten (unsigned int spalten) {Spalten = spalten;};
		void SetZeilen (unsigned int zeilen) {Zeilen = zeilen;};

		bool IsOK (void) const {return ok;};

		friend std::ostream&amp; operator &lt;&lt; (std::ostream &amp; out, const MyMatrix &amp; matrix);
		void operator = (const MyMatrix &amp; matrix2);
		MyMatrix&amp; operator + (const MyMatrix &amp; matrix);
		MyMatrix&amp; operator += (const MyMatrix &amp; matrix2);
		bool operator == (const MyMatrix &amp; matrix2);
		bool operator != (const MyMatrix &amp; matrix2);
};
</code></pre>
<pre><code class="language-cpp">//Code an sich:
MyMatrix::MyMatrix (void) : Spalten (0), Zeilen (0), ok (true)
{}
//etc - tut hier jz aber nix zur Sache
</code></pre>
<p>Und da bekomm ich für jede Funktion, die ich so definieren will wieder folgende Fehlermeldung:</p>
<pre><code>matrizen.obj : error LNK2005: &quot;public: __thiscall MyMatrix::MyMatrix(void)&quot; (??0MyMatrix@@QAE@XZ) ist bereits in main.obj definiert.
</code></pre>
<p>Also gelesen hab ich es schon - verstehen tu ich es auch - aber eben nur grammatikalisch - oder gar nicht ^^<br />
Also ich weiß nicht, was er mit den *.obj - Dateien will - die legt er auch immer erst beim Compilieren an - also am Namen an sich liegt es denke auch nicht...</p>
<p>Danke schon mal ^^</p>
<p>Bye Tom</p>
<p>//edit:<br />
Ist erstellt als ein ganz normales <strong>leeres</strong> WIN32-Konsolen-Projekt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449447</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 05 Feb 2008 01:37:41 GMT</pubDate></item><item><title><![CDATA[Reply to Class -&amp;gt; friend oder nicht on Tue, 05 Feb 2008 06:41:46 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>Ich spam mal gleich hier weiter, hab gerad noch nen mir völlig unbegreifliches Problem...</p>
<p>...</p>
<p>Und da bekomm ich für jede Funktion, die ich so definieren will wieder folgende Fehlermeldung:</p>
<pre><code>matrizen.obj : error LNK2005: &quot;public: __thiscall MyMatrix::MyMatrix(void)&quot; (??0MyMatrix@@QAE@XZ) ist bereits in main.obj definiert.
</code></pre>
</blockquote>
<p>Auf anhieb fallen mir schon einmal fehlende Include-Guards auf. Sprich etwas wie dem folgenden:</p>
<p>Header:</p>
<pre><code class="language-cpp">#if !defined(PROJEKTNAME_HEADERNAME_HEADER)
#defined PROJEKTNAME_HEADERNAME_HEADER

// &lt;-- Hier den eigentlichen inhalt des Headers einfügen

#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1449461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449461</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 05 Feb 2008 06:41:46 GMT</pubDate></item><item><title><![CDATA[Reply to Class -&amp;gt; friend oder nicht on Tue, 05 Feb 2008 08:06:02 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>davie schrieb:</p>
<blockquote>
<p>Interessanterweise erspart man sich dann meistens sogar das &quot;friend&quot;. Warum es sich trotzdem eingebürgert hat? Den einzigen syntaktischen Vorteil, den ich dann noch sehe, ist bei der Deklaration von template-Operatoren.</p>
</blockquote>
<p>Weil es den Operator in offensichtlicher Weise dem Interface der Klasse zuordnet?</p>
</blockquote>
<p>Hm, nach dem interface principle braucht der op dazu weder friend noch innerhalb der Klassendefinition zu sein. Eigentlich sagt ja auch schon der gesunde Menschenverstand, dass eine freie Funktion, die im gleichen Header wie die Klasse X kommt und ein Argument vom Typ X hat, wohl zu deren Schnittstelle gehört.</p>
<blockquote>
<p>Zudem erlaubt es die Definition der Funktion innerhalb der Klassendefinition (dabei spart man sogar noch ein inline).</p>
</blockquote>
<p>Sind Nichtmember, die innerhalb einer Klasse definiert werden, auch implizit inline deklariert? Dachte das gelte nur für Member.</p>
<blockquote>
<p>Und dann ist da noch das Namelookup...</p>
</blockquote>
<p>Inwiefern spielt das da eine Rolle? Bzw. in welchen Fällen findet das Namelookup für in-der-Klasse-Deklarationen etwas, was es bei normalen freien nonfreinds nicht findet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449481</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 05 Feb 2008 08:06:02 GMT</pubDate></item><item><title><![CDATA[Reply to Class -&amp;gt; friend oder nicht on Tue, 05 Feb 2008 12:46:14 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>davie schrieb:</p>
<blockquote>
<p>Interessanterweise erspart man sich dann meistens sogar das &quot;friend&quot;. Warum es sich trotzdem eingebürgert hat? Den einzigen syntaktischen Vorteil, den ich dann noch sehe, ist bei der Deklaration von template-Operatoren.</p>
</blockquote>
<p>Weil es den Operator in offensichtlicher Weise dem Interface der Klasse zuordnet?</p>
</blockquote>
<p>Hm, nach dem interface principle braucht der op dazu weder friend noch innerhalb der Klassendefinition zu sein. Eigentlich sagt ja auch schon der gesunde Menschenverstand, dass eine freie Funktion, die im gleichen Header wie die Klasse X kommt und ein Argument vom Typ X hat, wohl zu deren Schnittstelle gehört.</p>
</blockquote>
<p>Mit dem gesunden Menschenverstand ist das so eine Sache. Wie man in diesem Forum oft feststellen kann, fällt es vielen schwer, freie und Memberfunktionen nicht für etwas grundsätzlich Verschiedenes zu halten.</p>
<blockquote>
<blockquote>
<p>Zudem erlaubt es die Definition der Funktion innerhalb der Klassendefinition (dabei spart man sogar noch ein inline).</p>
</blockquote>
<p>Sind Nichtmember, die innerhalb einer Klasse definiert werden, auch implizit inline deklariert? Dachte das gelte nur für Member.</p>
</blockquote>
<p>Auch für friends. Sonst wäre es ja nicht möglich, die Klasse in mehr als einer ÜE zu verwenden.</p>
<blockquote>
<blockquote>
<p>Und dann ist da noch das Namelookup...</p>
</blockquote>
<p>Inwiefern spielt das da eine Rolle? Bzw. in welchen Fällen findet das Namelookup für in-der-Klasse-Deklarationen etwas, was es bei normalen freien nonfreinds nicht findet?</p>
</blockquote>
<p>Umgekehrt und nur wenn die Funktion in der friend-Deklaration auch definiert wird. Eine friend-Funktion wird durch unqualifiziertes Lookup im umschließenden Namensraum nur gefunden, wenn sie in diesem Namensraum zuvor deklariert wurde. Ein friend, der ausschließlich in der Klasse deklariert und definiert wird, wird folglich durch unqualifiziertes Lookup nur gefunden, wenn man sich im Scope der Klasse befindet. Das ist vorteilhaft, weil man so einigen ungewollten Kollisionen aus dem Weg gehen kann. z.B.</p>
<pre><code class="language-cpp">struct foo; // kein op==
struct bar
{
    Bar(const Foo&amp;);
    ...
};
bool operator==(const Bar&amp;, const Bar&amp;);

bool foo(const foo&amp; x, const foo&amp; y)
{
    return x == y; // ruft bool operator==(const Bar&amp;, const Bar&amp;) auf
}
</code></pre>
<p>Hier rufen wir eindeutig den falschen Operator auf, auf die gleiche Weise können Mehrdeutigkeiten entstehen, die es nicht geben sollte. Bei friend-Definition in der Klasse ohne Redeklaration im Namensraum, würde dieser Operator nicht gefunden werden. Anders wenn wenigstens ein Operator vom Typ bar ist, dann wird dieser Operator per ADNL gefunden werden, und das ist dann ja auch richtig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449703</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 05 Feb 2008 12:46:14 GMT</pubDate></item><item><title><![CDATA[Reply to Class -&amp;gt; friend oder nicht on Tue, 05 Feb 2008 14:32:22 GMT]]></title><description><![CDATA[<blockquote>
<p>Auf anhieb fallen mir schon einmal fehlende Include-Guards auf.</p>
</blockquote>
<p>Hab ich - hab ich nur nicht mitgepostet - wird auch nur einmal included - von daher sollte (!?) das auch egal sein ^^</p>
<p>Oder ist das falsch:</p>
<pre><code class="language-cpp">#ifndef MATRIZEN_CPP
#define MATRIZEN_CPP

//benötigte includes, klassen-deklaration und definition der fkt

#endif //#ifndef MATRIZEN_CPP
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1449826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449826</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 05 Feb 2008 14:32:22 GMT</pubDate></item><item><title><![CDATA[Reply to Class -&amp;gt; friend oder nicht on Tue, 05 Feb 2008 14:55:15 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">struct foo; // kein op==
struct bar
{
    Bar(const Foo&amp;);
    ...
};
bool operator==(const Bar&amp;, const Bar&amp;);

bool foo(const foo&amp; x, const foo&amp; y)
{
    return x == y; // ruft bool operator==(const Bar&amp;, const Bar&amp;) auf
}
</code></pre>
<p>Hier rufen wir eindeutig den falschen Operator auf, auf die gleiche Weise können Mehrdeutigkeiten entstehen, die es nicht geben sollte.</p>
</blockquote>
<p>ich dachte schon fast, dass du *darauf* hinauswillst. aber ist das tatsächlich der falsche operator, der aufgerufen wird?<br />
ist es tatsächlich sinnvoll, folgenden drei fällen unterschiedliche semantik zu geben?</p>
<pre><code class="language-cpp">//erstens
struct bar;
bool operator(bar const&amp;, bar const&amp;);
//...
struct foo {};

struct bar
{
   bar (foo const&amp;);
   friend bool operator (bar const&amp;, bar const&amp;);
}

//zweitens
struct foo {};

struct bar
{
   bar (foo const&amp;);
   friend bool operator (bar const&amp;, bar const&amp;) { }
}

//drittens
struct bar
{
   bar (foo const&amp;);
   friend bool operator (bar const&amp;, bar const&amp;);
};

bool operator (bar const&amp;, bar const&amp;)
</code></pre>
<p>wenn die automatische umwandlung von foo nach bar unterdrücken will, sollte man dann nicht lieber auf den umwandlungskonstruktor verzichten?</p>
<pre><code class="language-cpp">struct bar
{
   explicit bar(foo const&amp;);
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1449842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449842</guid><dc:creator><![CDATA[davie]]></dc:creator><pubDate>Tue, 05 Feb 2008 14:55:15 GMT</pubDate></item><item><title><![CDATA[Reply to Class -&amp;gt; friend oder nicht on Tue, 05 Feb 2008 14:57:32 GMT]]></title><description><![CDATA[<p>man vergebe mir die syntaktischen fehler und das fehlende == im eifer des gefechts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449845</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449845</guid><dc:creator><![CDATA[davie]]></dc:creator><pubDate>Tue, 05 Feb 2008 14:57:32 GMT</pubDate></item></channel></rss>