JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=2da63be41c2640e1a77b1ad0802f23adMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

direkter Zugriff auf ein Array welches ein Attribut ist

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
C++Builder
Senior JLI'ler



Anmeldedatum: 04.10.2003
Beiträge: 235

Medaillen: Keine

BeitragVerfasst am: 28.11.2003, 16:03    Titel: direkter Zugriff auf ein Array welches ein Attribut ist Antworten mit Zitat

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] Question
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
HotAcid
Super JLI'ler


Alter: 43
Anmeldedatum: 04.08.2002
Beiträge: 372
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 28.11.2003, 17:12    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
C++Builder
Senior JLI'ler



Anmeldedatum: 04.10.2003
Beiträge: 235

Medaillen: Keine

BeitragVerfasst am: 28.11.2003, 18:22    Titel: Antworten mit Zitat

danke hätt ich auch selbst drauf kommen können Embarassed
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
C++Builder
Senior JLI'ler



Anmeldedatum: 04.10.2003
Beiträge: 235

Medaillen: Keine

BeitragVerfasst am: 28.11.2003, 18:55    Titel: Antworten mit Zitat

wie kann ich das mit dem ganzen string proggen Question

Bsp:

Code:

mstring wort;

strcpy(wort.string,"test");

cout << wort.string < endl;




dann statt wort.string gleich wort
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
HotAcid
Super JLI'ler


Alter: 43
Anmeldedatum: 04.08.2002
Beiträge: 372
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 28.11.2003, 22:14    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 29.11.2003, 12:37    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
HotAcid
Super JLI'ler


Alter: 43
Anmeldedatum: 04.08.2002
Beiträge: 372
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 29.11.2003, 12:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 29.11.2003, 16:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
HotAcid
Super JLI'ler


Alter: 43
Anmeldedatum: 04.08.2002
Beiträge: 372
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 29.11.2003, 16:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
C++Builder
Senior JLI'ler



Anmeldedatum: 04.10.2003
Beiträge: 235

Medaillen: Keine

BeitragVerfasst am: 29.11.2003, 19:26    Titel: Antworten mit Zitat

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 Question


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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
HotAcid
Super JLI'ler


Alter: 43
Anmeldedatum: 04.08.2002
Beiträge: 372
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 29.11.2003, 20:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum