<?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[2D Matrix und Funktionsobjekt - Operator[]]]></title><description><![CDATA[<p>hi</p>
<p>Ich hab eine etwas seltsame Fehlermeldung</p>
<blockquote>
<p>error C2678: binary '[' : no operator found which takes a left-hand operand of type 'const Matrix2D' (or there is no acceptable conversion)<br />
could be 'int *Simple2DimArr::operator [](int)'<br />
while trying to match the argument list '(const Matrix2D, int)'</p>
</blockquote>
<p>bei folgendem Code. (Die Simple2DimArr Klasse hab ich aus der FAQ)</p>
<pre><code class="language-cpp">class Simple2DimArr
{
    private:
        int* pArr;
        int Rows, Cols;
    public:
        Simple2DimArr(int Zeilen, int Spalten)
        {
            Rows = Zeilen;
            Cols = Spalten;
            pArr = new int[Rows * Cols];
        }
        int* operator[](int Zeile)
        {
            return &amp; pArr[Zeile * Cols];
        }
        ~Simple2DimArr()
        {
            delete [] pArr;
        }
};

typedef Simple2DimArr Matrix2D;

struct distance_compare
{
	int source_;
	const Matrix2D&amp; distance_;
	distance_compare( int source, const Matrix2D&amp; distance )
		: source_( source ), distance_( distance ){}
	bool operator()( const int&amp; lhs, const int&amp; rhs )
	{
		return distance_[source][lhs] &gt; distance_[source][rhs];  // &lt;--- In diese Zeile springt der Debugger
	}
};

//Anwendung
int main()
{
    {   // Testblock
		Matrix2D distance(3,3);
		distance[0][0] = 0; 
		distance[0][1] = 1; 
		distance[0][2] = 2; 
		distance[1][0] = 1; 
		distance[1][1] = 0; 
		distance[1][2] = 1; 
		distance[2][0] = 2; 
		distance[2][1] = 1; 
		distance[2][2] = 0; 

		std::cout &lt;&lt; distance[1][1] &lt;&lt; std::endl;
	} 
	return 0;
}
// getestetes Minimalbsp.
</code></pre>
<p>Wenn ich die struct distance_compare auskommentiere gehts.</p>
<p>Hat jemand vielleicht einen Tipp für mich?<br />
Wäre super <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/topic/157337/2d-matrix-und-funktionsobjekt-operator</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Apr 2026 03:33:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/157337.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 24 Aug 2006 16:42:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 2D Matrix und Funktionsobjekt - Operator[] on Thu, 24 Aug 2006 16:42:31 GMT]]></title><description><![CDATA[<p>hi</p>
<p>Ich hab eine etwas seltsame Fehlermeldung</p>
<blockquote>
<p>error C2678: binary '[' : no operator found which takes a left-hand operand of type 'const Matrix2D' (or there is no acceptable conversion)<br />
could be 'int *Simple2DimArr::operator [](int)'<br />
while trying to match the argument list '(const Matrix2D, int)'</p>
</blockquote>
<p>bei folgendem Code. (Die Simple2DimArr Klasse hab ich aus der FAQ)</p>
<pre><code class="language-cpp">class Simple2DimArr
{
    private:
        int* pArr;
        int Rows, Cols;
    public:
        Simple2DimArr(int Zeilen, int Spalten)
        {
            Rows = Zeilen;
            Cols = Spalten;
            pArr = new int[Rows * Cols];
        }
        int* operator[](int Zeile)
        {
            return &amp; pArr[Zeile * Cols];
        }
        ~Simple2DimArr()
        {
            delete [] pArr;
        }
};

typedef Simple2DimArr Matrix2D;

struct distance_compare
{
	int source_;
	const Matrix2D&amp; distance_;
	distance_compare( int source, const Matrix2D&amp; distance )
		: source_( source ), distance_( distance ){}
	bool operator()( const int&amp; lhs, const int&amp; rhs )
	{
		return distance_[source][lhs] &gt; distance_[source][rhs];  // &lt;--- In diese Zeile springt der Debugger
	}
};

//Anwendung
int main()
{
    {   // Testblock
		Matrix2D distance(3,3);
		distance[0][0] = 0; 
		distance[0][1] = 1; 
		distance[0][2] = 2; 
		distance[1][0] = 1; 
		distance[1][1] = 0; 
		distance[1][2] = 1; 
		distance[2][0] = 2; 
		distance[2][1] = 1; 
		distance[2][2] = 0; 

		std::cout &lt;&lt; distance[1][1] &lt;&lt; std::endl;
	} 
	return 0;
}
// getestetes Minimalbsp.
</code></pre>
<p>Wenn ich die struct distance_compare auskommentiere gehts.</p>
<p>Hat jemand vielleicht einen Tipp für mich?<br />
Wäre super <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/1123984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1123984</guid><dc:creator><![CDATA[l00ser]]></dc:creator><pubDate>Thu, 24 Aug 2006 16:42:31 GMT</pubDate></item><item><title><![CDATA[Reply to 2D Matrix und Funktionsobjekt - Operator[] on Thu, 24 Aug 2006 16:43:55 GMT]]></title><description><![CDATA[<p>Edit:<br />
..in Zeile 33 sollte es natürlich heissen</p>
<pre><code class="language-cpp">return distance_[source_][lhs] &gt; distance_[source_][rhs];
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1123986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1123986</guid><dc:creator><![CDATA[l00ser]]></dc:creator><pubDate>Thu, 24 Aug 2006 16:43:55 GMT</pubDate></item><item><title><![CDATA[Reply to 2D Matrix und Funktionsobjekt - Operator[] on Thu, 24 Aug 2006 17:14:30 GMT]]></title><description><![CDATA[<p>Hab das Problem eingeengt.<br />
Wenn ich beim Member von distance_compare</p>
<pre><code class="language-cpp">const Matrix2D&amp; distance_;
</code></pre>
<p>das const und die Referenz (&amp;) weglasse, kompiliert er obiges Beispiel ohne Murren und gibt 0 aus.<br />
Das Problem ist halt, das ich distance_compare in STL Algorithmen als Vergleichsoperator brauche.<br />
Und dabei gibts ein Assert von &quot;_BLOCK_TYPE_IS_VALID(pHead-&gt;nBlockUse)&quot;, schätze mal, dass der Array der 2DMatrix (int Zeiger) beim kopieren in den Algorithmus flöten geht.<br />
Wie kann ich dem entgegenwirken?</p>
<p>ps: code mit dem ich das getestet habe</p>
<pre><code class="language-cpp">int source = 1;
		distance_compare comp_1( source, distance );
		std::priority_queue&lt; int, std::vector&lt;int&gt;, distance_compare &gt; pqueue_1( comp_1 );
		for( int i = 0; i &lt; 3; ++i ) {
		    pqueue_1.push( distance[source][i] );
		}
		std::cout &lt;&lt; pqueue_1.top() &lt;&lt; std::endl;
		pqueue_1.pop();
		std::cout &lt;&lt; pqueue_1.top() &lt;&lt; std::endl;
		pqueue_1.pop();
		std::cout &lt;&lt; pqueue_1.top() &lt;&lt; std::endl;
		pqueue_1.pop();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1124003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1124003</guid><dc:creator><![CDATA[l00ser]]></dc:creator><pubDate>Thu, 24 Aug 2006 17:14:30 GMT</pubDate></item><item><title><![CDATA[Reply to 2D Matrix und Funktionsobjekt - Operator[] on Thu, 24 Aug 2006 17:32:08 GMT]]></title><description><![CDATA[<p>deine struct distance_compare hat ein member const Matrix2D</p>
<p>dadurch kannst du nur Funktionen aufrufen, die auch als const deklariert sind bei deiner klasse.<br />
also noch dazuügen:</p>
<pre><code class="language-cpp">// in die Klasse
const int* const operator[](int Zeile) { return ....} const;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1124016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1124016</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Thu, 24 Aug 2006 17:32:08 GMT</pubDate></item><item><title><![CDATA[Reply to 2D Matrix und Funktionsobjekt - Operator[] on Thu, 24 Aug 2006 17:38:45 GMT]]></title><description><![CDATA[<p>Hm, dann kann ich aber nicht mehr die Werte zuweisen.<br />
Lass ich das erste const weg, geht zwar die Zuweisung, aber beim Vergleichen kommt ein Fehler:</p>
<blockquote>
<p>Unhandled exception at 0x00417861 in Test.exe: 0xC0000005: Access violation reading location 0xfbcefb20.</p>
</blockquote>
<p>Habe das Gefühl, ich such im leeren Raum.. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1124020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1124020</guid><dc:creator><![CDATA[l00ser]]></dc:creator><pubDate>Thu, 24 Aug 2006 17:38:45 GMT</pubDate></item><item><title><![CDATA[Reply to 2D Matrix und Funktionsobjekt - Operator[] on Thu, 24 Aug 2006 17:49:49 GMT]]></title><description><![CDATA[<p>naja, du hast eben eine const-funktion und eine nicht-konst-fuktion. Der compiler nimmt dann die, die er gerade brauch. Lass beide drin, dann müsts doch gehn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1124026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1124026</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Thu, 24 Aug 2006 17:49:49 GMT</pubDate></item><item><title><![CDATA[Reply to 2D Matrix und Funktionsobjekt - Operator[] on Thu, 24 Aug 2006 18:02:21 GMT]]></title><description><![CDATA[<p>*freu*<br />
Mir is grad der Knoten aufgegangen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /><br />
Stichwort: <a href="http://www.sgi.com/tech/stl/Assignable.html" rel="nofollow">Assignable</a> für Klassen mit Zeigern und Arrays<br />
Hab dem 2D-Array nen ordentlichen Copyconstructor und operator= verpasst, der mir auch den Array Inhalt korrekt kopiert.<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/2470">@Maxi</a><br />
Das geht auch nicht, der Assert kommt wieder. Aber trotzdem Danke! Das const und die Referenz vom Member distance_ sind nun nicht mehr nötig, und alle Aktionen sind nun auch in STL Algorithmen verfügbar.</p>
<p>Hier nochmal die aktuelle Version:</p>
<pre><code class="language-cpp">class Simple2DimArr
{
    private:
        int* pArr;
        int Rows, Cols;
    public:
        Simple2DimArr(int Zeilen, int Spalten)
        {
            Rows = Zeilen;
            Cols = Spalten;
            pArr = new int[Rows * Cols];
        }
		Simple2DimArr( const Simple2DimArr&amp; other )
		{
			Rows = other.Rows;
			Cols = other.Cols;
			pArr = new int[Rows * Cols];
			for( int i = 0; i &lt; Rows * Cols; ++i ) {
				pArr[i] = other.pArr[i];
			}			
		}
		Simple2DimArr operator=( const Simple2DimArr&amp; other )
		{
			Rows = other.Rows;
			Cols = other.Cols;
			pArr = new int[Rows * Cols];
			for( int i = 0; i &lt; Rows * Cols; ++i ) {
				pArr[i] = other.pArr[i];
			}
			return *this;
		}
        int* operator[](int Zeile)
        {
            return &amp; pArr[Zeile * Cols];
        }
        ~Simple2DimArr()
        {
            delete [] pArr;
        }
};

typedef Simple2DimArr Matrix2D;

////compare funktions objekt
struct distance_compare
{
	int source_;
	Matrix2D distance_;
	distance_compare( int source, const Matrix2D&amp; distance )
		: source_( source ), distance_( distance ){}
	bool operator()( const int&amp; lhs, const int&amp; rhs )
	{
		return distance_[source_][lhs] &gt; distance_[source_][rhs];
	}
};

int main()
{
    {   // Testblock
		Matrix2D distance(3,3);
		distance[0][0] = 0; 
		distance[0][1] = 1; 
		distance[0][2] = 2; 
		distance[1][0] = 1; 
		distance[1][1] = 0; 
		distance[1][2] = 1; 
		distance[2][0] = 2; 
		distance[2][1] = 1; 
		distance[2][2] = 0; 
		std::cout &lt;&lt; distance[1][1] &lt;&lt; std::endl;

		//Priority Queue
		int source = 0;
		distance_compare comp_1( source, distance );
		std::priority_queue&lt; int, std::vector&lt;int&gt;, distance_compare &gt; pqueue_1( comp_1 );
		for( int i = 0; i &lt; 3; ++i ) {
		    pqueue_1.push( distance[source][i] );
		}
		std::cout &lt;&lt; pqueue_1.top() &lt;&lt; std::endl;
		pqueue_1.pop();
		std::cout &lt;&lt; pqueue_1.top() &lt;&lt; std::endl;
		pqueue_1.pop();
		std::cout &lt;&lt; pqueue_1.top() &lt;&lt; std::endl;
		pqueue_1.pop();
	}   // Testblock
	return 0;
}
</code></pre>
<p>Für Verbesserungsvorschläge wär ich natürlich auch sehr dankbar. <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/1124034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1124034</guid><dc:creator><![CDATA[l00ser]]></dc:creator><pubDate>Thu, 24 Aug 2006 18:02:21 GMT</pubDate></item><item><title><![CDATA[Reply to 2D Matrix und Funktionsobjekt - Operator[] on Fri, 25 Aug 2006 07:25:15 GMT]]></title><description><![CDATA[<p>vergiss beim operator= nich, noch dedn alten speicher zu deleten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1124231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1124231</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Fri, 25 Aug 2006 07:25:15 GMT</pubDate></item></channel></rss>