<?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[Problem mit Überladen von operator()]]></title><description><![CDATA[<p>Hallo, ich bin C++-Anfänger.</p>
<p>Ich habe eine Klasse Array3D mit Zugriffsoperator:</p>
<pre><code>class Array3D
{ ...
private:
	T ***mat; //das eigentl. gekapselte dynamische 3D-Array
	unsigned int length1, length2, length3; //die 3 Dimensionen
};

//! Initialisiert das dreidimensionale Array.
template&lt;class T&gt;
void Array3D&lt;T&gt;::init(unsigned int length1, unsigned int length2, unsigned int length3, T value) {
	this-&gt;length1 = length1;
	this-&gt;length2 = length2;
	this-&gt;length3 = length3;
	mat = new T** [length2]; 
	for (unsigned int i = 0; i &lt; length2; i++) {
		mat[i] = new T* [length1];
		for (unsigned int j = 0; j &lt; length1; j++) {
			mat[i][j] = new T [length3];
		}
	}
	for (unsigned int i = 0; i &lt; length3; i++) {
		for (unsigned int j = 0; j &lt; length2; j++) {
			for (unsigned int k = 0; k &lt; length1; k++) {
				mat[j][i][k] = value; 
			}
		}
	}
}

//! ()-Zugriffs-Operator fuer das gekapselte dynamische dreidimensionale Array mat fuer non-const - Array3D-Objekt. 
template&lt;class T&gt;
T&amp; Array3D&lt;T&gt;::operator() (unsigned int x, unsigned int y, unsigned int z) {
	assert(x &lt;= length1 &amp;&amp; y &lt;= length2 &amp;&amp; z &lt;= length3);
	return mat[y][x][z];
}

//! ()-Zugriffs-Operator fuer das gekapselte dynamische dreidimensionale Array mat fuer const - Array3D-Objekt. 
template&lt;class T&gt;
T Array3D&lt;T&gt;::operator() (unsigned int x, unsigned int y, unsigned int z) const {
	assert(x &lt;= length1 &amp;&amp; y &lt;= length2 &amp;&amp; z &lt;= length3);
	return mat[y][x][z];
...
}
</code></pre>
<p>und einen Filter, ebenfalls mit Zugriffsoperator, der den Operator von Array3D verwendet.</p>
<pre><code>class Filter
{
protected:
	Array3D&lt;unsigned int&gt; mat;
...
unsigned int&amp; Filter::operator() (unsigned int x, unsigned int y, unsigned int z) {
	return mat(x, y, z);
}

unsigned int Filter::operator() (unsigned int x, unsigned int y, unsigned int z) const {
	return mat(x, y, z);
}
</code></pre>
<p>Wenn ich nun:</p>
<pre><code>Filter *f = new Gauss_Filter(3);
cout &lt;&lt; f-&gt;operator ()(1, 1, 1);
</code></pre>
<p>dann bekomme ich eine Zugriffsverletzung beim Lesen an Position...</p>
<p>Kann mir jmd. helfen <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/topic/314966/problem-mit-überladen-von-operator</link><generator>RSS for Node</generator><lastBuildDate>Fri, 31 Jul 2026 13:56:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/314966.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 19 Mar 2013 18:50:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Überladen von operator() on Tue, 19 Mar 2013 18:50:48 GMT]]></title><description><![CDATA[<p>Hallo, ich bin C++-Anfänger.</p>
<p>Ich habe eine Klasse Array3D mit Zugriffsoperator:</p>
<pre><code>class Array3D
{ ...
private:
	T ***mat; //das eigentl. gekapselte dynamische 3D-Array
	unsigned int length1, length2, length3; //die 3 Dimensionen
};

//! Initialisiert das dreidimensionale Array.
template&lt;class T&gt;
void Array3D&lt;T&gt;::init(unsigned int length1, unsigned int length2, unsigned int length3, T value) {
	this-&gt;length1 = length1;
	this-&gt;length2 = length2;
	this-&gt;length3 = length3;
	mat = new T** [length2]; 
	for (unsigned int i = 0; i &lt; length2; i++) {
		mat[i] = new T* [length1];
		for (unsigned int j = 0; j &lt; length1; j++) {
			mat[i][j] = new T [length3];
		}
	}
	for (unsigned int i = 0; i &lt; length3; i++) {
		for (unsigned int j = 0; j &lt; length2; j++) {
			for (unsigned int k = 0; k &lt; length1; k++) {
				mat[j][i][k] = value; 
			}
		}
	}
}

//! ()-Zugriffs-Operator fuer das gekapselte dynamische dreidimensionale Array mat fuer non-const - Array3D-Objekt. 
template&lt;class T&gt;
T&amp; Array3D&lt;T&gt;::operator() (unsigned int x, unsigned int y, unsigned int z) {
	assert(x &lt;= length1 &amp;&amp; y &lt;= length2 &amp;&amp; z &lt;= length3);
	return mat[y][x][z];
}

//! ()-Zugriffs-Operator fuer das gekapselte dynamische dreidimensionale Array mat fuer const - Array3D-Objekt. 
template&lt;class T&gt;
T Array3D&lt;T&gt;::operator() (unsigned int x, unsigned int y, unsigned int z) const {
	assert(x &lt;= length1 &amp;&amp; y &lt;= length2 &amp;&amp; z &lt;= length3);
	return mat[y][x][z];
...
}
</code></pre>
<p>und einen Filter, ebenfalls mit Zugriffsoperator, der den Operator von Array3D verwendet.</p>
<pre><code>class Filter
{
protected:
	Array3D&lt;unsigned int&gt; mat;
...
unsigned int&amp; Filter::operator() (unsigned int x, unsigned int y, unsigned int z) {
	return mat(x, y, z);
}

unsigned int Filter::operator() (unsigned int x, unsigned int y, unsigned int z) const {
	return mat(x, y, z);
}
</code></pre>
<p>Wenn ich nun:</p>
<pre><code>Filter *f = new Gauss_Filter(3);
cout &lt;&lt; f-&gt;operator ()(1, 1, 1);
</code></pre>
<p>dann bekomme ich eine Zugriffsverletzung beim Lesen an Position...</p>
<p>Kann mir jmd. helfen <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/2308040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2308040</guid><dc:creator><![CDATA[emgi103]]></dc:creator><pubDate>Tue, 19 Mar 2013 18:50:48 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Überladen von operator() on Tue, 19 Mar 2013 19:02:50 GMT]]></title><description><![CDATA[<p>Das ist kein 3D-Array, das ist eine Art Listen von Listen von Listen oder so. Ein 3D-Array sieht so aus: vector&lt;T&gt; v(l1 * l2 * l3), die Indexe darfst du dann selbst berechnen. Das ist nicht nur <strong>wesentlich</strong> effizienter, sondern macht die ganzen &quot;Algorithmen&quot; auch noch nahezu trivial.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2308043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2308043</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 19 Mar 2013 19:02:50 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Überladen von operator() on Tue, 19 Mar 2013 19:14:20 GMT]]></title><description><![CDATA[<p>Bevor du da den Fehler suchst, solltest du die Funktion noch einmal überarbeiten.</p>
<p>Es ist in diesem Fall Schwachsinn, Pointer auf Pointer auf Pointer zu haben. Stattdessen solltest du die Elemente sinnvoll anordnen und als ganzen Block im Speicher haben.<br />
Du brauchst insgesamt ein Array der Größe length1*length2*length3<br />
Darauf greifst du zu, indem du den Index berechnest durch ((z*length2)+y)*length1+x<br />
Dann kannst du die Daten auch einfach in std::vector kapseln und sparst dir den unsicheren Umgang mit new[] und delete[].<br />
Statt assertions solltest du lieber Exceptions verwenden.</p>
<p>Dann sehe ich nicht ein, warum du den Gaussfilter mit new erzeugst, das wird dann nämlich viel übersichtlicher, schneller und sicherer:</p>
<pre><code>Gauss_Filter f(3);
cout &lt;&lt; f(1, 1, 1);
</code></pre>
<p>Die Operatoren haben doch gegenüber Funktionen den Vorteil, dass man sie einfacher und intuitiver verwenden kann, also in dem Beispiel hier ein Objekt wie eine Funktion aufrufen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2308049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2308049</guid><dc:creator><![CDATA[Marthog]]></dc:creator><pubDate>Tue, 19 Mar 2013 19:14:20 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Überladen von operator() on Tue, 19 Mar 2013 19:38:06 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">assert(x &lt;= length1 &amp;&amp; y &lt;= length2 &amp;&amp; z &lt;= length3);
</code></pre>
<p>Statt &quot;kleiner gleich&quot; muss es hier &quot;kleiner&quot; heissen.<br />
So wie Du es bei der Initialisierung in den for-Schleifen richtig hast.</p>
<p>Denk dran, dass bei 0 angefangen wird zu nummerieren:</p>
<pre><code class="language-cpp">Filter *f = new Gauss_Filter(3);
cout &lt;&lt; f-&gt;operator ()(1, 1, 1); // das interne array ist min. [2][2][2]?
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2308052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2308052</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Tue, 19 Mar 2013 19:38:06 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Überladen von operator() on Tue, 19 Mar 2013 22:01:38 GMT]]></title><description><![CDATA[<blockquote>
<p>Statt &quot;kleiner gleich&quot; muss es hier &quot;kleiner&quot; heissen.</p>
</blockquote>
<p>Danke Dir, hatte schon einige Probleme damit, die ich nicht gesehen habe...</p>
<blockquote>
<p>cout &lt;&lt; f-&gt;operator ()(1, 1, 1); // das interne array ist min. [2][2][2]?</p>
</blockquote>
<p>Ja, new Gauss_Filter(3) legt ein ein &quot;Array&quot; der Größe [3][3][3] an.</p>
<blockquote>
<p>Dann kannst du die Daten auch einfach in std::vector kapseln</p>
</blockquote>
<p>Werde ich versuchen...</p>
<p>Die Sache ist, dass</p>
<pre><code>Array3D&lt;double&gt;* mat = new Array3D&lt;double&gt;(3, 3, 3, 0.0);
cout &lt;&lt; mat-&gt;operator ()(1, 1, 1) &lt;&lt; endl;
</code></pre>
<p>funktioniert und</p>
<pre><code>Filter *f = new Gauss_Filter(3);
cout &lt;&lt; f-&gt;operator ()(1, 1, 1);
</code></pre>
<p>und</p>
<pre><code>Gauss_Filter *fg = new Gauss_Filter(3);
cout &lt;&lt; fg;
cout &lt;&lt; fg-&gt;operator ()(1, 1, 1) &lt;&lt; endl;
</code></pre>
<p>nicht...</p>
<p>Ich würde gerne folgendes machen...<br />
Filter ist die &quot;Oberklasse&quot;, Gauss_Filter und Homogen_Filter Unterklassen:</p>
<pre><code>Filter* f = new Gauss_Filter(3);
cout &lt;&lt; f;
f-&gt;setMask(5);
cout &lt;&lt; f;
f = new Homogen_Filter(3);
cout &lt;&lt; f;
f-&gt;setMask(7);
cout &lt;&lt; f;
</code></pre>
<p>also zwischen den Filtern hin und her wechseln...<br />
und darauf zugreifen mittels operator()</p>
<p>btw: &lt;&lt; habe ich ebenfalls überladen und das funktioniert...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2308056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2308056</guid><dc:creator><![CDATA[emgi103]]></dc:creator><pubDate>Tue, 19 Mar 2013 22:01:38 GMT</pubDate></item></channel></rss>