Archiv verlassen und diese Seite im Standarddesign anzeigen : Doppelten []-Operator ("[][]") überladen
schoppenhauer
26-02-2007, 20:11
Hallo.
Ich habe ein Problem: Und zwar hab ich sowas wie ne Tabelle als Klasse, die quasi sowas wie ein zweidimensionales Array darstellt.
Die Klasse hat zwei Funktionen
T get (int x, int y);
void set (int x, int y, T t);
Jetzt würde ich es aber auch gerne so haben, dass ich quasi mit
tabelle[x][y]auf das jeweilige Element zugreifen kann. Dass das zumindest Theoretisch geht, wenn ich "dazwischen" eine Klasse definiere, die tabelle[x] zurückgibt, und die dann nochmal den op [] überlädt, das ist mir klar...
Andererseits produziert mir das zu viel Overhead. Kann man das auch irgendwie direkt überladen? Oder meinetwegen auch, dass man in die eckigen klammern halt zwei durch Kommata getrennte Variablen schreiben kann?
Irgendwie sowas in der Art wäre schön, ich vermute aber fast, dass das nicht geht. Weiß das jemand?
Yonibear
27-02-2007, 07:59
Wenn du den Operator und die gesamte Hilfsklasse inline machst, sollte das keinen Laufzeit-Overhead erzeugen. Um den Code-Overhead kommst du allerdings nicht herum.
Mehrere Parameter einem Operator zu übergeben geht aber definitiv nicht, das sieht die C++-Syntax nicht vor.
peschmae
27-02-2007, 10:04
Du könntest natürlich auch eine "Point(int x, int y)"-Klasse definieren und den Operator für diese überladen. Oder so ähnlich.
MfG Peschmä
schoppenhauer
27-02-2007, 13:18
Wenn du den Operator und die gesamte Hilfsklasse inline machst, sollte das keinen Laufzeit-Overhead erzeugen. Um den Code-Overhead kommst du allerdings nicht herum.Naja, Code-Overhead schadet ja nix. Dafür hab ich an anderer Stelle ja kürzeren und wesentlich übersichtlicheren Code. Aber wie macht man eine Klasse inline? Also ich meine, mindestens einen Pointer auf meine ursprüngliche Klasse muss es ja geben... Und der produziert dann wieder Overhead. Vielleicht nicht viel, aber er produziert ihn. Also bzw. ich weiß wohl einfach nicht genau, wie du meinst.
Du könntest natürlich auch eine "Point(int x, int y)"-Klasse definieren und den Operator für diese überladen. Oder so ähnlich.Hm... Hab ich damit nicht genau dasselbe Problem, nämlich, dass ich immernoch den [][]-Operator überladen muss?
anda_skoa
27-02-2007, 14:00
Ich glaube ich habe mal einen operator(int, int) überladen gesehen.
Ist zwar kein traditioneller Index Operator, aber vielleicht geht das auch?
Ciao,
_
schoppenhauer
27-02-2007, 22:18
Hm... Weiß nicht, was du meinst, würde aber reichen.
das mit dem x[5][6] geht auch, ueber zwischenobjekte.
dein operator[] an deiner basisklasse muesste die nen Object(klasse) vom Typ X geben, welchen selber auch den operator [] ueberlaed.
Wobei ich persoenlich ned viel von doppelten [] zugriffen halte. Ich wuerd den klammeroperator () ueberschreiben, der kann mehrere parameter. (hoffentlich) positiver nebeneffekt ist dass dein object dann auch zum funktor wird ... vielleicht kannst das ja sinnvoll einsetzen
Ciao ...
schoppenhauer
05-03-2007, 16:55
Und wie geht das? Einfach zellen_typ tabellen_typ::operator () (int x, int y)?
Und wie geht das? Einfach zellen_typ tabellen_typ:perator () (int x, int y)?
genau ....
class x
{
public:
ValueT & operator () (size_t x, size_t y);
const ValueT & operator () (size_t x, size_t y) const;
};
wenn keine referenzen nehmen kannst sondern direkte werte dann
class x
{
public:
ValueT operator () (size_t x, size_t y) const;
};
wobei ich bei tabellen mehrere möglichkeiten ala ....
value = table.rows(5).columns(3)
oder
value = table.cells(5,3)
favourisieren wuerde, macht die ganze sache flexiebler ....
Ciao ...
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.