<?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[Probleme mit friend Deklaration]]></title><description><![CDATA[<p>Hallo</p>
<p>ich moechte einen istream iterator fuer meine Klasse schreiben. Dabei wollte ich ihn als friend deklarieren. Allerdings bekomme ich viele Fehlermeldungen, wenn ich friend vor meine Deklaration schreibe. Lasse ich friend weg fallen auch die fehlermeldungen weg. Allerdings braeuchte ich die friend Deklaration da ich auf meine private Member zugreifen sollte im Falle des globalen istream operators.</p>
<p>istream methode meiner point klasse:</p>
<pre><code class="language-cpp">friend istream&amp; PointN::operator&gt;&gt;(istream&amp; in) 
{ 	
	int iDim = getDim();
	for(int i = 0; i &lt; iDim; i++) 
		in &gt;&gt; data[i]; 
	return in;
}
</code></pre>
<p>globaler istream operator:</p>
<pre><code class="language-cpp">istream&amp; operator&gt;&gt;(istream&amp; in, PointN&amp; p) 
{ 
	if( !p.data ) 
     { 
         p.data = new double[3]; 
         p.dim = 3; 
     }

	int iDim = p.getDim();
	for(int i = 0; i &lt; iDim; i++) 
		in &gt;&gt; p[i]; 
	return in;
}
</code></pre>
<p>Die Fehlermeldungen dazu lauten unter anderem:</p>
<p>error C2805: binary 'operator &gt;&gt;' has too few parameters<br />
error C2248: 'PointN::data' : cannot access private member declared in class 'PointN'</p>
<p>woran liegt das? Sorry, mit streams steh ich noch etwas auf Kriegsfuss</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/135000/probleme-mit-friend-deklaration</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 20:25:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/135000.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 30 Jan 2006 09:54:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit friend Deklaration on Mon, 30 Jan 2006 09:54:33 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>ich moechte einen istream iterator fuer meine Klasse schreiben. Dabei wollte ich ihn als friend deklarieren. Allerdings bekomme ich viele Fehlermeldungen, wenn ich friend vor meine Deklaration schreibe. Lasse ich friend weg fallen auch die fehlermeldungen weg. Allerdings braeuchte ich die friend Deklaration da ich auf meine private Member zugreifen sollte im Falle des globalen istream operators.</p>
<p>istream methode meiner point klasse:</p>
<pre><code class="language-cpp">friend istream&amp; PointN::operator&gt;&gt;(istream&amp; in) 
{ 	
	int iDim = getDim();
	for(int i = 0; i &lt; iDim; i++) 
		in &gt;&gt; data[i]; 
	return in;
}
</code></pre>
<p>globaler istream operator:</p>
<pre><code class="language-cpp">istream&amp; operator&gt;&gt;(istream&amp; in, PointN&amp; p) 
{ 
	if( !p.data ) 
     { 
         p.data = new double[3]; 
         p.dim = 3; 
     }

	int iDim = p.getDim();
	for(int i = 0; i &lt; iDim; i++) 
		in &gt;&gt; p[i]; 
	return in;
}
</code></pre>
<p>Die Fehlermeldungen dazu lauten unter anderem:</p>
<p>error C2805: binary 'operator &gt;&gt;' has too few parameters<br />
error C2248: 'PointN::data' : cannot access private member declared in class 'PointN'</p>
<p>woran liegt das? Sorry, mit streams steh ich noch etwas auf Kriegsfuss</p>
]]></description><link>https://www.c-plusplus.net/forum/post/980785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/980785</guid><dc:creator><![CDATA[samo]]></dc:creator><pubDate>Mon, 30 Jan 2006 09:54:33 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit friend Deklaration on Mon, 30 Jan 2006 10:15:24 GMT]]></title><description><![CDATA[<p>Du hast das friend an der falschen Stelle hingesetzt - die erste Funktion ist ein Member deiner Klasse und benötigt deshalb kein friend (und hat die falsche Operator-Anordnung für die üblichen Ein/Ausgabe-Operatoren), die zweite Funktion ist KEIN friend.<br />
Richtig wäre es so:</p>
<pre><code class="language-cpp">class PointN
{
public:
  ...
  friend istream&amp; operator&gt;&gt;(istream&amp; in,PointN&amp; p);
  ...
};

istream&amp; operator&gt;&gt;(istream&amp; in,PontN&amp; p)
{
    if( !p.data ) 
    { 
        p.data = new double[3]; 
        p.dim = 3; 
    }

    int iDim = p.getDim();
    for(int i = 0; i &lt; iDim; i++) 
        in &gt;&gt; p[i]; 
    return in;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/980797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/980797</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 30 Jan 2006 10:15:24 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit friend Deklaration on Mon, 30 Jan 2006 10:26:31 GMT]]></title><description><![CDATA[<p>Das verstehe ich so nicht. In meiner Point Klasse muss ich doch nicht zusaetzlich noch ein Point Objekt uebergeben. Und was bedeutet falsche Operator Anordnung?</p>
<p>Jetzt bekomme ich folgende Fehlermeldung:<br />
error C2039: '&gt;&gt;' : is not a member of 'PointN'</p>
<p>Aber ich habe doch den operator in PointN deklariert und definiert, wieso erkennt er das denn nicht?</p>
<pre><code class="language-cpp">class PointN
{
     friend istream&amp; operator&gt;&gt;(istream&amp;, PointN&amp;);
}
</code></pre>
<p>PointN cpp:</p>
<pre><code class="language-cpp">istream&amp; PointN::operator&gt;&gt;(istream&amp; in, PointN&amp; p) 
{ 	
	int iDim = p.getDim();
	for(int i = 0; i &lt; iDim; i++) 
		in &gt;&gt; p[i]; 
	return in;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/980806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/980806</guid><dc:creator><![CDATA[samo]]></dc:creator><pubDate>Mon, 30 Jan 2006 10:26:31 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit friend Deklaration on Mon, 30 Jan 2006 10:33:40 GMT]]></title><description><![CDATA[<p>samo schrieb:</p>
<blockquote>
<p>Das verstehe ich so nicht. In meiner Point Klasse muss ich doch nicht zusaetzlich noch ein Point Objekt uebergeben.</p>
</blockquote>
<p>]Mit friend wird dem Compiler gesagt, daß die nachfolgende Deklaration keine Memberfunktion deiner Klasse ist, aber trotzdem besondere Zugriffsrechte bekommen soll.</p>
<blockquote>
<p>Und was bedeutet falsche Operator Anordnung?</p>
</blockquote>
<p>Das bedeutet, dein PointN::operator&gt;&gt;() müsste so aufgerufen werden:</p>
<pre><code class="language-cpp">PointN p;
p&gt;&gt;cin;
</code></pre>
<p>(das ist zwar machbar, entspricht aber nicht ganz der &quot;üblichen&quot; Schreibweise)</p>
<blockquote>
<p>Jetzt bekomme ich folgende Fehlermeldung:<br />
error C2039: '&gt;&gt;' : is not a member of 'PointN'</p>
<p>Aber ich habe doch den operator in PointN deklariert und definiert, wieso erkennt er das denn nicht?</p>
</blockquote>
<p>Der Operator ist &quot;nur&quot; ein Freund der PointN-Klasse, keine Memberfunktion - also kannst du bei der Definition das &quot;PointN::&quot; weglassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/980815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/980815</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 30 Jan 2006 10:33:40 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit friend Deklaration on Mon, 30 Jan 2006 11:05:17 GMT]]></title><description><![CDATA[<p>dankeschoen, der istream_iterator scheint soweit zu funktionieren. Aber jetzt stuerzt mein Programm an dieser Stelle hier ab:</p>
<pre><code class="language-cpp">istream_iterator&lt;PointN&gt; begin(file); // Anfangsiterator auf die Datei 
			istream_iterator&lt;PointN&gt; end; // Enditerator 
			copy(begin,end,back_inserter(vBasePoints));
</code></pre>
<p>und zwar mit der assertion :</p>
<p>Expression: _BLOCK_TYPE_IS_VALID</p>
<p>und wenn ich dann retry mache stoert er sich an meinem destructor der point-klasse</p>
<pre><code class="language-cpp">PointN::~PointN(void)
{
	if(data != NULL)
	{
		delete [] data;
		data = NULL;
		dim = 0;
	}
}
</code></pre>
<p>Stimmt dann etwas ad der allocierung im istream operator noch nicht oder hat das einen anderen grund?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/980848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/980848</guid><dc:creator><![CDATA[samo]]></dc:creator><pubDate>Mon, 30 Jan 2006 11:05:17 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit friend Deklaration on Mon, 30 Jan 2006 11:12:36 GMT]]></title><description><![CDATA[<p>Ich vermute eher ein Problem mit dem back_inserter und dem Copy-Construktor deiner Klasse (hast du überhaupt einen?). Geh doch mal im Call-Stack eine Ebene nach oben, um zu sehen, von wo aus der Destruktor aufgerufen wird.</p>
<p>(btw, am Ende des Dtor's ist dein Objekt eh hin, da brauchst du nicht noch extra die Membervariablen auf 0 zurücksetzen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/980857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/980857</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 30 Jan 2006 11:12:36 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit friend Deklaration on Mon, 30 Jan 2006 11:22:54 GMT]]></title><description><![CDATA[<p>er stuerzt am ende der copy funktion ab, wenn er alle punkte eingelesen hat. ich denke das haengt mit der zerstoerung der istream operatoren zusammen. ich habe eine copy funktion fuer die point klasse</p>
<pre><code class="language-cpp">PointN::PointN(const PointN &amp;rhs)
{
	dim = rhs.dim;
	if (dim&gt;0)
	{
		data = new double[dim];
		for (int i=0;i&lt;dim;i++)
			data[i]=rhs.data[i];
	}
	invalid = false;
}
</code></pre>
<p>die bis jetzt auch gute dienste geleistet hat <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>
]]></description><link>https://www.c-plusplus.net/forum/post/980866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/980866</guid><dc:creator><![CDATA[samo]]></dc:creator><pubDate>Mon, 30 Jan 2006 11:22:54 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit friend Deklaration on Mon, 30 Jan 2006 11:33:45 GMT]]></title><description><![CDATA[<p>Hast du auch einen Zuweisungsoperator in deiner Klasse (sicher ist sicher - ich frag lieber mal nach)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/980873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/980873</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 30 Jan 2006 11:33:45 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit friend Deklaration on Mon, 30 Jan 2006 12:17:24 GMT]]></title><description><![CDATA[<p>ja hab ich auch</p>
<pre><code class="language-cpp">PointN&amp; PointN::operator=(const PointN &amp;rhs)
{
	dim = rhs.dim;
	if (dim &gt; 0)
	{
		data = new double[dim];
		for (int i = 0; i &lt; dim; i++)
			data[i] = rhs.data[i];
	}
	invalid = false;
	return(*this);
}
</code></pre>
<p>Mir scheint dass bei der Zerstoerung der iteratoren irgendetwas schief laeuft. koennte das nicht sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/980922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/980922</guid><dc:creator><![CDATA[samo]]></dc:creator><pubDate>Mon, 30 Jan 2006 12:17:24 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit friend Deklaration on Mon, 30 Jan 2006 12:22:54 GMT]]></title><description><![CDATA[<p>Mir scheint zunächst, daß dein Zuweisungsoperator noch eine Absicherung gegen Selbstzuweisung benötigen könnte. (obwohl das in deinem Zusammenhang eher unwahrscheinlich ist).</p>
<p>Nur mal zum Test: Kannst du mal in alle Con- und Destruktoren eine Debug-Ausgabe einbauen, um zu überprüfen, wann und wo sie aufgerufen werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/980926</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/980926</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 30 Jan 2006 12:22:54 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit friend Deklaration on Mon, 30 Jan 2006 12:40:24 GMT]]></title><description><![CDATA[<p>in der copy methode wird am schluss zweimal der destructor der point methode aufgerufen, ich nehme an fuer jeden iterator (einmal fuer begin, einmal fuer end). beim loeschen des end iterators stuerzt das programm mit der assertion ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/980955</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/980955</guid><dc:creator><![CDATA[samo]]></dc:creator><pubDate>Mon, 30 Jan 2006 12:40:24 GMT</pubDate></item></channel></rss>