<?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[Operator[] überladen. Funktion bei Schreibzugriff ausführen.]]></title><description><![CDATA[<p>Hallo zusammen!</p>
<p>Ich bin relativ neu und habe eine Frage bzgl. Operator[]. Ich komme aus der Welt von Delphi und möchte gerne fragen, ob es in C++ auch möglich ist, beim *Schreibzugriff* auf [] eine Funktion ausführen zu lassen.</p>
<p>Also so ein Szenario:<br />
test = new MyClass();<br />
test[5] = 100;</p>
<p>Dabei soll test[5] nicht eine Referenz auf die entsprechende Speicherstelle zurückliefern. Ich möchte, dass dabei eine Funktion ausgeführt wird, die die Zahl &quot;100&quot; z.B. in eine MySQL-Tabelle schreibt (ist nur ein Beispiel).<br />
Bei &quot;test[5] = 100&quot; soll also eine Funktion wie &quot;void MyClass::writeValue(int index, int value)&quot; ausgeführt werden.</p>
<p>Danke für eure Hilfe!</p>
<p>//Edit:<br />
In Delphi würde das etwa so gehen:</p>
<pre><code>TMyClass = class
private
 function readItem(Index: Integer): Integer;
 procedure writeItem(Index: Integer; Value: Integer);
public
 property Item[Index: Integer]: Integer read readItem write writeItem; default;
end;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/128569/operator-überladen-funktion-bei-schreibzugriff-ausführen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 18:19:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/128569.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 05 Dec 2005 00:30:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Operator[] überladen. Funktion bei Schreibzugriff ausführen. on Mon, 05 Dec 2005 00:35:45 GMT]]></title><description><![CDATA[<p>Hallo zusammen!</p>
<p>Ich bin relativ neu und habe eine Frage bzgl. Operator[]. Ich komme aus der Welt von Delphi und möchte gerne fragen, ob es in C++ auch möglich ist, beim *Schreibzugriff* auf [] eine Funktion ausführen zu lassen.</p>
<p>Also so ein Szenario:<br />
test = new MyClass();<br />
test[5] = 100;</p>
<p>Dabei soll test[5] nicht eine Referenz auf die entsprechende Speicherstelle zurückliefern. Ich möchte, dass dabei eine Funktion ausgeführt wird, die die Zahl &quot;100&quot; z.B. in eine MySQL-Tabelle schreibt (ist nur ein Beispiel).<br />
Bei &quot;test[5] = 100&quot; soll also eine Funktion wie &quot;void MyClass::writeValue(int index, int value)&quot; ausgeführt werden.</p>
<p>Danke für eure Hilfe!</p>
<p>//Edit:<br />
In Delphi würde das etwa so gehen:</p>
<pre><code>TMyClass = class
private
 function readItem(Index: Integer): Integer;
 procedure writeItem(Index: Integer; Value: Integer);
public
 property Item[Index: Integer]: Integer read readItem write writeItem; default;
end;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/934575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/934575</guid><dc:creator><![CDATA[seeplusplus]]></dc:creator><pubDate>Mon, 05 Dec 2005 00:35:45 GMT</pubDate></item><item><title><![CDATA[Reply to Operator[] überladen. Funktion bei Schreibzugriff ausführen. on Mon, 05 Dec 2005 00:39:26 GMT]]></title><description><![CDATA[<p>da baust du eine zusätzliche kleine klasse, die vom op[] zurüchgegeben wird und deren op= in die datenbank schreibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/934577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/934577</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 05 Dec 2005 00:39:26 GMT</pubDate></item><item><title><![CDATA[Reply to Operator[] überladen. Funktion bei Schreibzugriff ausführen. on Mon, 05 Dec 2005 00:45:01 GMT]]></title><description><![CDATA[<p>Okay, das würde gehen. Dann müsste man aber zusätzlich noch eine Referenz auf die ursprüngliche Klasse mitgeben; da sonst die &quot;zusätzliche kleine Klasse&quot; keine Ahnung hat, für welche Klasse er das jetzt erledigen muss.<br />
Das sehe ich jetzt noch nicht ganz, wie man das implementieren würde...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/934578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/934578</guid><dc:creator><![CDATA[seeplusplus]]></dc:creator><pubDate>Mon, 05 Dec 2005 00:45:01 GMT</pubDate></item><item><title><![CDATA[Reply to Operator[] überladen. Funktion bei Schreibzugriff ausführen. on Mon, 05 Dec 2005 00:52:59 GMT]]></title><description><![CDATA[<p>nö ne referenz brauchst du meiner meinung nach nicht. wozu auch ?<br />
du gibst ne referenz auf die kleine klasse mit einem operator[] zurück.<br />
ihr operator= bekommt den wert und ruft die funktion auf die den eintrag machen soll. die &quot;kleine&quot; klasse muss also nichts von der wissen von der sie zurückgegeben wird.<br />
Das ist aber genau das was volkard schon gesagt hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/934579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/934579</guid><dc:creator><![CDATA[shapeless]]></dc:creator><pubDate>Mon, 05 Dec 2005 00:52:59 GMT</pubDate></item><item><title><![CDATA[Reply to Operator[] überladen. Funktion bei Schreibzugriff ausführen. on Mon, 05 Dec 2005 00:56:50 GMT]]></title><description><![CDATA[<p>seeplusplus schrieb:</p>
<blockquote>
<p>Okay, das würde gehen. Dann müsste man aber zusätzlich noch eine Referenz auf die ursprüngliche Klasse mitgeben; da sonst die &quot;zusätzliche kleine Klasse&quot; keine Ahnung hat, für welche Klasse er das jetzt erledigen muss.</p>
</blockquote>
<p>an sich richtig erkannt. nur tricksen wir und machen diese referenz zum attribut der kleinen klasse und setzen sie im ctor der kleinen klasse.</p>
<p>die anderen attribute der kleinen klasse sind wohl die sachen, die dem op[] übergeben wurden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/934582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/934582</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 05 Dec 2005 00:56:50 GMT</pubDate></item><item><title><![CDATA[Reply to Operator[] überladen. Funktion bei Schreibzugriff ausführen. on Mon, 05 Dec 2005 01:31:02 GMT]]></title><description><![CDATA[<p>Ja stimmt, so einfach geht's <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="😉"
    /><br />
Vielen Dank nochmals für eure Antworten!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/934594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/934594</guid><dc:creator><![CDATA[seeplusplus]]></dc:creator><pubDate>Mon, 05 Dec 2005 01:31:02 GMT</pubDate></item><item><title><![CDATA[Reply to Operator[] überladen. Funktion bei Schreibzugriff ausführen. on Mon, 05 Dec 2005 02:04:52 GMT]]></title><description><![CDATA[<p>Hmm, so klar war's doch noch nicht.<br />
Okay, der Operator[] gibt eine Referenz auf die Hilfsklasse zurück. Das heisst ich muss im Operator eine Klasse instanzieren und diese per Referenz zurückgeben. Die muss man dann aber irgendwo wieder vernichten -- macht man das dann im Operator= der Hilfsklasse?<br />
Die zweite Frage wäre noch: Ich muss ja zwei Operatoren[] definieren, eine für zum Schreiben und eine zum Lesen... Das seh ich jetzt auch noch nicht ganz, wie man das lösen soll....<br />
Ist das sehr kompliziert, oder könnte mir jemand nicht die paar Zeilen schreiben? Ich hab sonst als Newbie ewig dran..<br />
Ich will doch nur, dass beim Schreiben und Lesen jeweils eine eigene Funktion aufgerufen wird.. <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=":\"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/934597</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/934597</guid><dc:creator><![CDATA[seeplusplus]]></dc:creator><pubDate>Mon, 05 Dec 2005 02:04:52 GMT</pubDate></item><item><title><![CDATA[Reply to Operator[] überladen. Funktion bei Schreibzugriff ausführen. on Mon, 05 Dec 2005 02:22:57 GMT]]></title><description><![CDATA[<p>Also ich will nicht reinreden, weil volkard und ich wohl verschiedene Ansätze meinen. aber soviel sollte allgemein gelten:</p>
<p>seeplusplus schrieb:</p>
<blockquote>
<p>Das heisst ich muss im Operator eine Klasse instanzieren und diese per Referenz zurückgeben.</p>
</blockquote>
<p>Referenz auf lokales Objekt ist Unsinn.<br />
So wie ich es verstanden hab meinte volkard die haupklasse hat eine Instanz der hilfsklasse als member und diese hat eine referenz auf die hauptklasse als member ( müsste dann eh referenz oder zeiger sein, da es sonst nicht kompiliert) und initialisiert diese im ctor der hilfklasse...<br />
// er kann mich hier gern korrigieren.</p>
<p>also alles in allem sollte die klasse mit dem op[] ne instanz der hilfklasse haben, diese auch initialisiert haben und dann im op[] zurückgeben.</p>
<p>Meine frage wäre, könntest du das design so ändern, dass die hilfsklasse nichts von der, die sie aufruft wissen braucht? wenn ja reich wenn sie member der anderen ist und ne referenz auf sie zurückgegeben wird.<br />
sie macht quasi dann mittels op= den funktionsaufruf , also quasi die arbeit.<br />
was muss denn die klasse mit op[] können ? eigentlich nichts, wenn die mit dem op= alles verwalten kann. naja wie gesagt ich kann das design und die klasse nicht, aber vll passt meine idee ja, ansonsten spricht natürlich nichts gegen volkards vorschlag, im gegenteil.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/934598</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/934598</guid><dc:creator><![CDATA[shapeless]]></dc:creator><pubDate>Mon, 05 Dec 2005 02:22:57 GMT</pubDate></item><item><title><![CDATA[Reply to Operator[] überladen. Funktion bei Schreibzugriff ausführen. on Mon, 05 Dec 2005 03:13:47 GMT]]></title><description><![CDATA[<p>Leider funktioniert das Lesen nicht wirklich. Es kommt die Fehlermeldung &quot;cannot convert from 'WriteItemHelpClass' to 'int'&quot;. Da muss was am &quot;operator[](const int index) const&quot; falsch sein... Ich hab echt keinen Plan.. Die Erzeugung einer Instanz der Hilfsklasse im Operator[] finde ich nicht wirklich sauber. Schon von Anfang an eine Hilfsklasse initialisiert zu haben finde ich auch nicht wirklich sauber.</p>
<p>Hmmm, bin jetzt fast etwas enttäuscht, dass das nicht besser geht. Und wenns schlussendlich doch irgendwie geht, wird es performance-mässig nicht top sein..</p>
<p>Das ist was ich bis jetzt hab...</p>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#include &lt;iostream&gt;
#include &lt;stdio.h&gt;

using namespace std;

class MyArray; 

// Hilfsklasse
class WriteItemHelpClass {
private:
	int index_;
	MyArray* myArray_;
public:
	int operator= (const int &amp;rhs);
	WriteItemHelpClass(MyArray *myArray, const int index) : myArray_(myArray), index_(index) { };
};

// Hauptklasse
class MyArray {
	void writeItem(int index, int value) {
		cout &lt;&lt; &quot;write [&quot; &lt;&lt; index &lt;&lt; &quot;] = &quot; &lt;&lt; value &lt;&lt; endl;
	}
	int readItem(int index) const {
		cout &lt;&lt; &quot;read [&quot; &lt;&lt; index &lt;&lt; &quot;]&quot; &lt;&lt; endl;
		return 0;
	}
public:
	const int
		operator[](const int index) const {
		return readItem(index);
	}
	WriteItemHelpClass&amp; operator[](const int index) {
		return *(new WriteItemHelpClass(this, index));
	}
	friend class WriteItemHelpClass;
};

WriteItemHelpClass::operator =(const int &amp;rhs) {
	myArray_-&gt;writeItem(index_, rhs);
	delete this;
	return rhs;
}

int _tmain(int argc, _TCHAR* argv[])
{
	MyArray test;
	test[3] = 123; // schreiben
	int i = test[4]; // cannot convert from 'WriteItemHelpClass' to 'int'
	return 0;
}
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9639">@shapeless</a>: Ich möchte eigentlich, dass die Hilfsklasse möglichst nichts tut, und dass sie möglicherweise sogar von mehreren Klassen gebraucht werden kann.. Sie soll so allgemein wie möglich sein. (Natürlich, wenn's nicht anders geht, werd ich's schlussendlich schon so lösen müssen, wie du es vorschlägst)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/934599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/934599</guid><dc:creator><![CDATA[seeplusplus]]></dc:creator><pubDate>Mon, 05 Dec 2005 03:13:47 GMT</pubDate></item><item><title><![CDATA[Reply to Operator[] überladen. Funktion bei Schreibzugriff ausführen. on Mon, 05 Dec 2005 07:29:25 GMT]]></title><description><![CDATA[<p>op[] gibt nicht by-reference zurück, sondern by-value. Damit erledigt sich auch die new/delete Geschichte, also weg damit.</p>
<pre><code class="language-cpp">int i = test[4]; // cannot convert from 'WriteItemHelpClass' to 'int'
</code></pre>
<p>Für sowas musst du deiner Proxyklasse noch einen operator int spendieren. Dieser übernimmt dann das Lesen, während op= fürs Schreiben zuständig ist.</p>
<p>Und deine Funktionssignaturen für op[] solltest du generell nochmal überarbeiten.</p>
<pre><code class="language-cpp">int operator [](int index) const
// oder
const int&amp; operator [](int index) const
// und entsprechend
WriteItemHelpClass operator [](int index)
</code></pre>
<p>Und da es nunmal keinen Sinn macht, dass index einen negativen Wert hat, ist es sinnvoll, hierfür einen unsigned Typ zu verwenden, zB size_t.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/934623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/934623</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Mon, 05 Dec 2005 07:29:25 GMT</pubDate></item><item><title><![CDATA[Reply to Operator[] überladen. Funktion bei Schreibzugriff ausführen. on Mon, 05 Dec 2005 16:23:16 GMT]]></title><description><![CDATA[<p>Hab jetzt eine funktionierende Lösung gefunden:</p>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#include &lt;iostream&gt;
#include &lt;stdio.h&gt;

using namespace std;

template &lt;class T&gt;
class BracketAux {
public:
	class BracketAuxOp {
		BracketAux&amp; object_;
		const int index_;
	public:
		BracketAuxOp(BracketAux&amp; object, const int index) : object_(object), index_(index) {}
		operator T() const {
			return object_.readBracket(index_);
		}
		void operator=(T value) {
			object_.writeBracket(index_, value);
		}
	}; // class BracketAuxOp

	virtual T readBracket( const int index ) const = 0;
	virtual void writeBracket( const int index, const T value ) = 0;
};

class MyClass: public BracketAux&lt;int&gt; {
private:
	int readBracket(const int index) const {
		cout &lt;&lt; &quot;read [&quot; &lt;&lt; index &lt;&lt; &quot;]&quot; &lt;&lt; endl;
		return 0;
	}
	void writeBracket(const int index, const int value) {
		cout &lt;&lt; &quot;write [&quot; &lt;&lt; index &lt;&lt; &quot;] = &quot; &lt;&lt; value &lt;&lt; endl;
	}
public:
	BracketAuxOp operator[](const int index);
};

inline MyClass::BracketAuxOp MyClass::operator[](const int index) {
	return BracketAuxOp(*this, index);
}

int _tmain(int argc, _TCHAR* argv[])
{
...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/935113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/935113</guid><dc:creator><![CDATA[seeplusplus]]></dc:creator><pubDate>Mon, 05 Dec 2005 16:23:16 GMT</pubDate></item></channel></rss>