<?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[CRgn als Wert zurückgeben]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe eine Funktion geschrieben die mir einer CRgn Klasse als Wert zurückgibt.</p>
<p>CRgn BorderRgn(CRgn &amp;rgn)<br />
{<br />
CRgn MeineRegion;</p>
<p>...</p>
<p>return MeineRegion;<br />
}</p>
<p>aber es lässt sich nicht kompilieren,<br />
der Compiler meldet ...</p>
<p>error C2558: class 'CRgn' : Kein Kopierkonstruktor verfuegbar</p>
<p>Was soll ich tun ?</p>
<p>Vielen Dank für Eure Hilfe.</p>
<p>Gruß Ronny</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/49884/crgn-als-wert-zurückgeben</link><generator>RSS for Node</generator><lastBuildDate>Fri, 26 Jun 2026 01:06:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/49884.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 24 Sep 2003 09:27:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to CRgn als Wert zurückgeben on Wed, 24 Sep 2003 09:27:02 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe eine Funktion geschrieben die mir einer CRgn Klasse als Wert zurückgibt.</p>
<p>CRgn BorderRgn(CRgn &amp;rgn)<br />
{<br />
CRgn MeineRegion;</p>
<p>...</p>
<p>return MeineRegion;<br />
}</p>
<p>aber es lässt sich nicht kompilieren,<br />
der Compiler meldet ...</p>
<p>error C2558: class 'CRgn' : Kein Kopierkonstruktor verfuegbar</p>
<p>Was soll ich tun ?</p>
<p>Vielen Dank für Eure Hilfe.</p>
<p>Gruß Ronny</p>
]]></description><link>https://www.c-plusplus.net/forum/post/359488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/359488</guid><dc:creator><![CDATA[Ronny W]]></dc:creator><pubDate>Wed, 24 Sep 2003 09:27:02 GMT</pubDate></item><item><title><![CDATA[Reply to CRgn als Wert zurückgeben on Wed, 24 Sep 2003 09:31:41 GMT]]></title><description><![CDATA[<p>gib die Region als Zeiger zurück, oder benutze HRGN</p>
]]></description><link>https://www.c-plusplus.net/forum/post/359492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/359492</guid><dc:creator><![CDATA[Shlo]]></dc:creator><pubDate>Wed, 24 Sep 2003 09:31:41 GMT</pubDate></item><item><title><![CDATA[Reply to CRgn als Wert zurückgeben on Wed, 24 Sep 2003 09:34:38 GMT]]></title><description><![CDATA[<p>return *MeineRegion</p>
<p>???</p>
<p>Ist das so korrekt ?</p>
<p>und wie muss dann die Funktion deklariert sein ?</p>
<p>Danke <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/359498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/359498</guid><dc:creator><![CDATA[Ronny W]]></dc:creator><pubDate>Wed, 24 Sep 2003 09:34:38 GMT</pubDate></item><item><title><![CDATA[Reply to CRgn als Wert zurückgeben on Wed, 24 Sep 2003 09:57:03 GMT]]></title><description><![CDATA[<p>Sagt der Standard nicht, dass es immer einen Copy-Konstruktor gibt? Und in den entsprechenden Headern ist er nicht explizit private oder protected deklariert...</p>
<p>Wie auch immer. Wenn du einen Pointer zurückgeben willst, musst du das Objekt auf dem Heap anlegen, also:</p>
<pre><code class="language-cpp">CRgn *BorderRgn(CRgn &amp;rgn)
{
  CRgn *MeineRegion = new CRgn();

  //... (MeineRegion ist jetzt ein Pointer, also alle member über -&gt; ansprechen)

  return MeineRegion;
}
</code></pre>
<p>Allerdings musst du dann nachher höllisch aufpassen, dass du den Speicher wieder freigibst, außen rum müsste das also so aussehen:</p>
<pre><code class="language-cpp">CRgn param, *border_reg;
//... param createn usw.
border_reg = BorderRgn(param);
//... damit arbeiten
delete border_reg;
</code></pre>
<p>Sinnvoller wäre wohl:</p>
<pre><code class="language-cpp">CRgn &amp;BorderRgn(CRgn &amp;rgn, CRgn &amp;MeineRegion) 
{
  //...
  return MeineRegion;
}
</code></pre>
<p>Das sieht zwar sehr nach C aus, hat aber den Vorteil, dass du keinen Speicher leckst. Der Aufruf sähe dann so aus:</p>
<pre><code class="language-cpp">CRgn param, border_reg;
//... param createn usw.
BorderRgn(param, border_reg);
//... damit arbeiten
//nachher ist kein delete nötig
</code></pre>
<p>Wenn du dir beide Möglichkeiten offen halten willst:</p>
<pre><code class="language-cpp">CRgn *BorderRgn(CRgn &amp;rg, CRgn *MeineRegion = NULL) 
{
  if(MeineRegion = NULL) 
  {
    MeineRegion = new CRgn();
    //Createn usw.
  }
  //...
  return MeineRegion;
}
</code></pre>
<p>Dann sähe der Aufruf im zweiten Fall (wenn du delete vermeiden willst) allerdings so aus:</p>
<pre><code class="language-cpp">BorderRgn(param, &amp;border_reg); //Adresse übergeben
</code></pre>
<p>weil in diesem Fall eine Referenz nicht ausreicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/359513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/359513</guid><dc:creator><![CDATA[0xdeadbeef]]></dc:creator><pubDate>Wed, 24 Sep 2003 09:57:03 GMT</pubDate></item><item><title><![CDATA[Reply to CRgn als Wert zurückgeben on Wed, 24 Sep 2003 09:59:58 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">//entweder
CRgn* Proc(/*...*/) { return &amp;CRgn(); }
//oder
HRGN Proc(/*...*/);
</code></pre>
<p>edit:<br />
ein Objekt auf dem Heap anzulegen braucht man nicht (unbedingt), ein lokales Objekt kann man als static deklarieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/359514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/359514</guid><dc:creator><![CDATA[Shlo]]></dc:creator><pubDate>Wed, 24 Sep 2003 09:59:58 GMT</pubDate></item><item><title><![CDATA[Reply to CRgn als Wert zurückgeben on Wed, 24 Sep 2003 20:51:35 GMT]]></title><description><![CDATA[<p>Das beste ist, als HRGN zurückzugeben. Man erspart sich 'ne menge Ärger.</p>
<pre><code>HRGN GetRgn()
{
  CRgn rgn;
  ...
  return (HRGN) rgn.Detach(); 
}

CRgn rgn = GetRgn();
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/3320">@Shlo</a>:<br />
return &amp;CRgn(...) ist aus zwei Gründen schlecht:</p>
<p>a) Du gibst die Adresse eines temporären Objekts zurück. Die kann zwar (mit COPY-Semanti) zugewiesen werden, aber da brauch man ja wieder einen Copy-CTor, und ist generell schlechtes Design für eine Funktionssignatur.<br />
b) Der Destructor von CGdiObject (von dem CRgn abgeleitet ist) ruft DeleteObject() auf - deine gekapselte HRGN ist also schon lange über den Jordan.</p>
<p>Und noch ein Dritter - die Adresse eines static-Members zurückzugeben geht nur solange gut, wie GetRgn auch nur mit einer Region arbeitet.</p>
<p>m.e. sind MFC's GDI-Objekt - Wrapperklassen eh' total verhunztund bereiten mehr Kopfschmerzen als vergnügen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/359964</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/359964</guid><dc:creator><![CDATA[peterchen]]></dc:creator><pubDate>Wed, 24 Sep 2003 20:51:35 GMT</pubDate></item><item><title><![CDATA[Reply to CRgn als Wert zurückgeben on Thu, 25 Sep 2003 06:24:17 GMT]]></title><description><![CDATA[<p>Danke für Eure Hilfe!</p>
<p>Meine Funktion sieht jetzt so aus..</p>
<pre><code class="language-cpp">HRGN BorderRgn(CRgn *SourceRgn)
{
   CRgn DestRgn;

   // ...

   return (HRGN) DestRgn.Destach();
}
</code></pre>
<p>soweit so gut.</p>
<p>nun möchte ich diese Region mit einer schon vorhandenen Region kombinieren...</p>
<pre><code class="language-cpp">CRgn MeineRegion, ZielRegion;
MeineRegion.CreateRectRgn(50, 50, 100, 100);

ZielRegion.CombineRgn(&amp;MeineRegion, BorderRgn(&amp;MeineRegion), RGN_OR);
</code></pre>
<p>Aber der Compiler streigt und sagt ...</p>
<p>error C2664: 'CombineRgn' : Konvertierung des Parameters 2 von 'struct HRGN__ *' in 'class CRgn *' nicht moeglich</p>
<p>Kann mir jemmand weiterhelfen <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="😕"
    /></p>
<p>Danke <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/360037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/360037</guid><dc:creator><![CDATA[Ronny W]]></dc:creator><pubDate>Thu, 25 Sep 2003 06:24:17 GMT</pubDate></item><item><title><![CDATA[Reply to CRgn als Wert zurückgeben on Thu, 25 Sep 2003 07:04:37 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">ZielRegion.CombineRgn(&amp;MeineRegion, &amp;CRgn(BorderRgn(&amp;MeineRegion)), RGN_OR);
</code></pre>
<p>Genau wegen diesem gefummel bevorzuge ich gleich mit HRGN's zu arbeiten..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/360064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/360064</guid><dc:creator><![CDATA[peterchen]]></dc:creator><pubDate>Thu, 25 Sep 2003 07:04:37 GMT</pubDate></item><item><title><![CDATA[Reply to CRgn als Wert zurückgeben on Thu, 25 Sep 2003 07:27:17 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">CRgn *CBorder::BorderRgn(CRgn *rgn)
{
	CRgn *DestRgn = new CRgn(), SourceRgn; 

	long	i, n, x,  y, size;
	bool	foundTop, foundBottom, foundLeft, foundRight;
	RECT	rect, checkrect;

	RGNDATA *RegionData;
	RECT    *pArray;

	size = GetRegionData(*rgn, sizeof(RGNDATA), NULL);				// Regiongröße ermitteln
	RegionData = (RGNDATA*) malloc(size);							// Speicher reservieren
	GetRegionData(*rgn, size, RegionData);							// Daten über Region ermitteln

	pArray = new RECT[(long)RegionData-&gt;rdh.nCount];

	for(i = 0; i &lt; (long)RegionData-&gt;rdh.nCount; i++)
	{
		memcpy(														// RECT in Array speichern
				&amp;pArray[i], 
				&amp;RegionData-&gt;Buffer[i * sizeof(RECT)],		
				sizeof(RECT)
				);
	}

	DestRgn-&gt;CreateRectRgn(0,0,0,0);								// leere Region erzeugen

	// Alle Rechtecke prüfen
	for(i = 0; i &lt; (long)RegionData-&gt;rdh.nCount; i++)
	{	
		checkrect = pArray[i];

		// X-Achse
		for(x = checkrect.left; x &lt; checkrect.right; x++)
		{
			foundTop = false;
			foundBottom = false;

			for(n = 0; n &lt; (long)RegionData-&gt;rdh.nCount; n++)
			{
				rect = pArray[n];

				// Prüfen ob rect auf x liegt
				if(rect.left + 1 &lt;= x &amp;&amp; rect.right - 2 &gt;= x)
				{
					// Prüfen ob rect auf MyRect.top - 1 liegt
					if(rect.top &lt;= checkrect.top - 1 &amp;&amp; rect.bottom - 1 &gt;= checkrect.top - 1)
					{
						foundTop = true;
					}

					// Prüfen ob rect auf MyRect.bottom + 1 liegt
					if(rect.top &lt;= checkrect.bottom + 1 &amp;&amp; rect.bottom &gt;= checkrect.bottom + 1)
					{
						foundBottom = true;
					}
				}
			}

			if(!foundTop)
			{
				SourceRgn.CreateRectRgn(x, checkrect.top, x + 1, checkrect.top + 1);
				DestRgn-&gt;CombineRgn(DestRgn, &amp;SourceRgn, RGN_OR);
			}

			if(!foundBottom)
			{
//				SourceRgn.CreateRectRgn(x, checkrect.bottom, x + 1, checkrect.bottom - 1);
//				DestRgn-&gt;CombineRgn(DestRgn, &amp;SourceRgn, RGN_OR);
			}
		}

		// Y-Achse
		for(y = checkrect.top; y &lt; checkrect.bottom; y++)
		{
			foundLeft = false;
			foundRight = false;

			for(n = 0; n &lt; (long)RegionData-&gt;rdh.nCount; n++)
			{
				rect = pArray[n];

				// Prüfen ob rect auf y liegt
				if(rect.top &lt;= y &amp;&amp; rect.bottom - 1 &gt;= y)
				{
					// Prüfen ob rect auf MyRect.left - 1 liegt
					if(rect.left &lt;= checkrect.left - 1 &amp;&amp; rect.right - 1 &gt;= checkrect.left - 1)
					{
						foundLeft = true;
					}

					// Prüfen ob rect auf MyRect.right + 1 liegt
					if(rect.left &lt;= checkrect.right + 1 &amp;&amp; rect.right - 1 &gt;= checkrect.right + 1)
					{
						foundRight = true;
					}
				}
			}

			if(!foundLeft)
			{
				//SourceRgn.CreateRectRgn(checkrect.left, y, checkrect.left + 1, y + 1);
				//DestRgn-&gt;CombineRgn(DestRgn, &amp;SourceRgn, RGN_OR);
			}

			if(!foundRight)
			{
				//SourceRgn.CreateRectRgn(checkrect.right, y, checkrect.right - 1, y + 1);
				//DestRgn-&gt;CombineRgn(DestRgn, &amp;SourceRgn, RGN_OR);
			}
		}
	}

	// DeleteObject(SourceRgn);

	delete [] pArray;

	return DestRgn;
}
</code></pre>
<p>Warum stürtzt wenn ich diese Funktion aufrufe immer mein Programm ab ?<br />
Hab schon alles ausprobiert aber es stürtzt immer ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/360074</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/360074</guid><dc:creator><![CDATA[Ronny W]]></dc:creator><pubDate>Thu, 25 Sep 2003 07:27:17 GMT</pubDate></item><item><title><![CDATA[Reply to CRgn als Wert zurückgeben on Thu, 25 Sep 2003 09:01:31 GMT]]></title><description><![CDATA[<p>wo stürzt es ab, wie, und schon mal mit dem Debugger eingekreist???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/360133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/360133</guid><dc:creator><![CDATA[peterchen]]></dc:creator><pubDate>Thu, 25 Sep 2003 09:01:31 GMT</pubDate></item><item><title><![CDATA[Reply to CRgn als Wert zurückgeben on Thu, 25 Sep 2003 09:22:11 GMT]]></title><description><![CDATA[<p>SourceRgn.CreateRectRgn(x, checkrect.top, x + 1, checkrect.top + 1);</p>
<p>es passiert weil ich die SourceRgn mehrmals verwende!<br />
Ich habe Sie in einer for-Schleife und setze sie jeweils auf ein neues Rechteck.</p>
<p>Als ich alles mit HRGN's gemacht hab, hat es funktioniert.<br />
Nur jetzt mit CRgn funktioniert es nicht mehr.</p>
<p>Weißt du wie ich diesen Fehler beheben kann ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/360155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/360155</guid><dc:creator><![CDATA[Ronny W]]></dc:creator><pubDate>Thu, 25 Sep 2003 09:22:11 GMT</pubDate></item></channel></rss>