Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
C++Builder Senior JLI'ler
Anmeldedatum: 04.10.2003 Beiträge: 235
Medaillen: Keine
|
Verfasst am: 28.11.2003, 16:03 Titel: direkter Zugriff auf ein Array welches ein Attribut ist |
|
|
also zum Problem
ich hab mir ne kleine string-klasse gebastelt:
Code: |
class mstring
{
public://Attribute
char *string;//(dynamisches array) enthält char-zeichen
int Length;
public://Memberfunktionen
#define MAX_LENGTH 256
#define ALL -1
mstring(void);
char *GetString(int Pos=ALL);//gibt das char-zeichen von i zurück
.
.
.
};
|
Bsp:
mstring wort;
um an ein elemt des arrays zukommen nimmt man nun GetString(pos) oder direkt
string[pos] das würde aber so wort.GetString(pos) oder so wort.string[pos]
aussehen
Frage: wie kann ich so auf die elemente zugreifen wort[pos] |
|
Nach oben |
|
|
HotAcid Super JLI'ler
Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 28.11.2003, 17:12 Titel: |
|
|
Zum ersten: Attribute einer Klasse sollten NIEMALS public sein.
zum zweiten:
Wenn ich dich richtig verstanden habe, möchtest du folgendes machen:
Code: |
mstring myString;
char c;
int pos = 1; // oder sonst irgendein Wert
c = myString[pos];
|
Ich empfehle dir DRINGEND, von dieser Idee anzurücken und die Funktion getString(int) zu benutzen. Diese Funktion macht übrigens auch nicht das, was du gerne möchtest, diese Funktion liefert den Teilstring von der Position i bis zum Ende, soweit ich das abschätzen kann. Du lieferst nämlich keinen char zurück, sondern einen Pointer auf char. Also nochmal auf deutsch: folgendes geht NICHT:
Code: |
mstring myString;
char c;
c = mstring.GetString();
|
Wenn du dennoch gegen alle Konventionen und vernünftige Programmierrichtlinien wie oben beschrieben mit c = myString[i] auf das entsprechende Zeichen zugreifen möchtest, dann musst du den [] - Operator entsprechend überladen.
cu Felix _________________ StGB §§ 328 Abs. 2 Pkt 3:
Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht. |
|
Nach oben |
|
|
C++Builder Senior JLI'ler
Anmeldedatum: 04.10.2003 Beiträge: 235
Medaillen: Keine
|
Verfasst am: 28.11.2003, 18:22 Titel: |
|
|
danke hätt ich auch selbst drauf kommen können |
|
Nach oben |
|
|
C++Builder Senior JLI'ler
Anmeldedatum: 04.10.2003 Beiträge: 235
Medaillen: Keine
|
Verfasst am: 28.11.2003, 18:55 Titel: |
|
|
wie kann ich das mit dem ganzen string proggen
Bsp:
Code: |
mstring wort;
strcpy(wort.string,"test");
cout << wort.string < endl;
|
dann statt wort.string gleich wort |
|
Nach oben |
|
|
HotAcid Super JLI'ler
Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 28.11.2003, 22:14 Titel: |
|
|
willst du also das:
Code: |
cout << wort << endl; |
hier hießt das Zauberwort wieder "überladen", und zwar diesmal den <<-Operator mit dem Argument "mstring".
Ich wiederhole mich auch gerne nochmal:
ATRIBUTE WERDEN NICHT PUBLIC GEMACHT
das ist ein *sehr* schlechter Stil, fang damit gar nicht erst an, schreib lieber ordenltiche getter/setter-Methoden, acuh wenn das für den Anfänger nur als aufwändig und weniger als nützlich empfunden wird. Aber glaub mir, es kommt irgendwann der Zeitpunkt, da willst du etwas an deiner klasse ändern und hast dann ein Problem mit deinem Code, weil nichts mehr stimmt.
cu Felix _________________ StGB §§ 328 Abs. 2 Pkt 3:
Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 29.11.2003, 12:37 Titel: |
|
|
Wiso sollte man Member Funktionen nie public erstellen. ICH bin der Programmierer ICH will entscheiden wie ich meine Klassen anspreche. Also alle Elemente sollten wirklich nicht private sein. Hängt alles vom eigenen Stil ab. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
HotAcid Super JLI'ler
Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 29.11.2003, 12:51 Titel: |
|
|
Bei kleinen Klassen und kleinen Projekten mag das wirklich nicht wichtig sein. Aber wenn du mal an einem großen Projekt arbeitest, an dem außer dir noch einige andere Leute dran arbeiten, dann ist es durchaus sinnvoll, dass nur auf eine Art und Weise auf die Daten zugegriffen werden kann, wie DU es möchtest, und sei es auch nur zum Schutz von Fehlinitialisierungen.
Oder du möchtest deinen Code ändern, indem du aus einem signed int ein unsigned int machst. Willst du dich jetzt wirklich durch hunderte Zeilen Code wühlen, um den Laufzeitfehler zu entdecken, der dadurch verursacht wird, weil du der Variable eine negative Zahl zugewiesen hast, die jetzt fehlerhaft interpretiert wird? Oder ist es einfacher, entrsprechende Vorkehrung in der setter-Methode zu machen?
Ähnliche Probleme können auch bei umfangreichen Vererbungshierarchien auftreten.
Es hat schon einen gewissen Sinn, dass jedes Buch und jeder erfahrene Programmierer dieses lehrt...
Wenn du allerdings der Meinung bist, dass deine Attribute jetzt auf Teufel komm raus public sein müssen, dann kannst du das Prinzip der OOP auch gleich wegschmeißen und dich mit den C-Strukturen beschäftigen.
cu Felix _________________ StGB §§ 328 Abs. 2 Pkt 3:
Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 29.11.2003, 16:31 Titel: |
|
|
Damit hast du schon recht. Doch nicht bei jeder variable treten solche Fehler auf. Und manchmal will man einige Attribute auch so testen ohne auf diese Funktionen zurückgreigfen zu müssen.
Meist mach ich das aber so wie er: indem ich kurzzeitig private auf public umbenenne. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
HotAcid Super JLI'ler
Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 29.11.2003, 16:42 Titel: |
|
|
Natürlich, wenns nur zum Testen ist, ist das auch kein Problem, vermutlich habe ich auch etwas überreagiert. Anhand der Frage habe ich einfach mal darauf geschlossen, dass er wohl noch eher Anfänger ist - sorry, falls ich da jetzt falsch liegen sollte - und wollte ihm das nur mal so in aller Deutlichkeit sagen.
cu Felix _________________ StGB §§ 328 Abs. 2 Pkt 3:
Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht. |
|
Nach oben |
|
|
C++Builder Senior JLI'ler
Anmeldedatum: 04.10.2003 Beiträge: 235
Medaillen: Keine
|
Verfasst am: 29.11.2003, 19:26 Titel: |
|
|
also ich hab jetzt die operatoren so überladen:
Code: |
char mstring::operator [](int Pos)
{
if(Pos>=0 && Pos<=Length)
return string[Pos];
else error=true;
return '0';
}
char *mstring::operator <<(mstring String)
{
return String.GetString();
} |
bei operator [] funts es aber bei operator << kommt hier: Code: |
cout << string << endl;
|
die Fehlermeldung:
error C2679: Binaerer Operator '<<' : Kein Operator definiert, der einen rechtsseitigen Operator vom Typ 'class mstring' akzeptiert (oder keine geeignete
Konvertierung moeglich)
was is das jetzt fürn problem
zum besseren Verständnis:
ich will das nich nur für cout überladen sondern z.B. auch so:
Code: |
mstring mystring1;
mstring mystring2;
mstring mystring3;
mystring1.SetString("das ist mein string");
mystring2.SetString(mystring); //ich möchte das hier das gleiche wie hier passiert:
mystring3.SetString(mystring1.GetString(); |
|
|
Nach oben |
|
|
HotAcid Super JLI'ler
Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 29.11.2003, 20:21 Titel: |
|
|
ohne cout zu überladen, wird die Ausgabe so das nicht möglich sein.
Code: | mystring1.SetString("das ist mein string");
mystring2.SetString(mystring); //ich möchte das hier das gleiche wie hier passiert:
|
wird auch nur funktionieren, wenn du SetString überlädst.
char* und mstring sind zwei verschiedene Datentypen, die für den Compiler nichts gemeinsam haben. Wenn du die beiden gleichwertig benutzen möchtest, wirst du alle Funktionen/Methoden überladen müssen.
cu Felix _________________ StGB §§ 328 Abs. 2 Pkt 3:
Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht. |
|
Nach oben |
|
|
|