String als Parameter
-
Hallo,
Ich danke euch. Jetzt Funktioniert es.

mfg,
Fettpet
-
übrigens: shcön formatierter code, gefällt mir...
-
char& operator[](int x,...) ;Wieso haste da ne Elipse (die 3 Pkt)? der op[] unterstützt so und so nur einen Parameter...
bb
-
Skym0sh0 schrieb:
übrigens: shcön formatierter code, gefällt mir...
Ja, und sogar Kommentare

-
unskilled schrieb:
char& operator[](int x,...) ;Wieso haste da ne Elipse (die 3 Pkt)? der op[] unterstützt so und so nur einen Parameter...
Also ich schreibe an einem Snack Spiel. Hierfür habe ich das Spielfeld in eine Klasse gesteckt. Das Feld ist 2 Dimensional. Ich kann aber nur die x Koordinate abfragen. Hierfür brauche ich die Ellipse.
-
Fettpet schrieb:
Also ich schreibe an einem Snack Spiel. Hierfür habe ich das Spielfeld in eine Klasse gesteckt. Das Feld ist 2 Dimensional. Ich kann aber nur die x Koordinate abfragen. Hierfür brauche ich die Ellipse.
Zum einen sind Ellipsen in C++ bestenfalls unschön, zum zweiten wirst Du damit nicht das erreichen was Du möchtest, denn: Der operator[] hat nur einen Parameter (per Definition).
-
LordJaxom schrieb:
Fettpet schrieb:
Also ich schreibe an einem Snack Spiel. Hierfür habe ich das Spielfeld in eine Klasse gesteckt. Das Feld ist 2 Dimensional. Ich kann aber nur die x Koordinate abfragen. Hierfür brauche ich die Ellipse.
Zum einen sind Ellipsen in C++ bestenfalls unschön, zum zweiten wirst Du damit nicht das erreichen was Du möchtest, denn: Der operator[] hat nur einen Parameter (per Definition).
Mhhhh....
Ok, was für eine schreibweiße würdest du mir empfehlen?
-
Wenn dein Feld so aussieht
std::vector<std::vector<char> > feld;dann kannst du ja einfach ein std::vector<char>& von deinem operator[] zurückgeben lassen.
Eine Alternative wäre der Zugriff über eine normale Memberfunktion.char& getElem(size_t x, size_t y) { return feld[x][y]; }
-
Man macht es über ein Proxy-Objekt...
Es gibt auch nen Artikel über Operatorüberladung hier - imho wird da dieses Prob auch angesprochen...also so was in etwa:
class proxy { private: char *first; size length; //oder std::vector public: char& operator[](size_t i) {assert (i < length); return first[i];} const char& operator[](size_t i) const {assert (i < length); return first[i];} }; class asd { public: //manche definieren auch hier ihr proxy-objekt, um die zugehörigkeit zu zeigen - kann man auch machen - wäre in dem fall wahrscheinlich auch richtiger private: std::vector <proxy> content; public: proxy& operator[](size_t i) {assert (i < content.size()); return content[i];} const proxy& operator[](size_t i) const {assert (i < content.size()); return content[i];} };#inlude "asd.h" int main() { asd a; a[2][3]; }verstanden? ^^
bb
edit: die ersten beiden zeilen
-
Oder wenn dir das Aussehen nicht so wichtig ist, kannst du auch eine einfache Memberfunktion mit zwei Parametern schreiben.
Was mir sonst noch aufgefallen ist:
- Klassentypen solltest du eher als Const-Referenz anstatt als Kopie an Funktionen übergeben. Also
const std::string&stattstd::string. - Der Konstruktor mit dem
std::fstream-Parameter kommt mir komisch vor. Willst du nicht besser nur einen Dateinamen angeben und dann das Streamen lokal vornehmen? Sonst muss der Aufrufer immer sicherstellen, dass er einen gültigen, an die richtige Position zeigenden Stream übergibt. - Parameter, die sowieso kopiert werden, macht man üblicherweise nicht
const(bei dirconst intundconst char). Das hat damit zu tun, dass es den Aufrufer nicht zu interessieren hat, was innerhalb der Funktion passiert. Ob eine Kopie nun konstant ist oder nicht, ist von aussen gesehen irrelevant.
- Klassentypen solltest du eher als Const-Referenz anstatt als Kopie an Funktionen übergeben. Also
-
Nexus schrieb:
Parameter, die sowieso kopiert werden, macht man üblicherweise nicht
const(bei dirconst intundconst char). Das hat damit zu tun, dass es den Aufrufer nicht zu interessieren hat, was innerhalb der Funktion passiert. Ob eine Kopie nun konstant ist oder nicht, ist von aussen gesehen irrelevant.Und die Funktionen haben die gleiche Signatur:
void bar(const char i); void bar(char i);Wenn man also den Parameter const machen möchte, dann kann das auch in der Source-Datei erst machen:
//*.h void bar (char i); //*.cpp #include "a.h" void bar (const char i) { //... }Ich mach das zwar auch ab und an mal so, aber sinnvoll find ich es nicht ^^
bb