[C/C++] Oparator für Klasse TString überladen

  • Ersteller Ersteller latita
  • Erstellt am Erstellt am
L

latita

Gast
Hallo,

ich hab mal wieder eine Frage:

nehmen wir an, ich habe eine Klasse TString mit private: char[20]
und will z.b. den "+=" Operator dahingehend überladen, dass damit einem string 1 per strcat buchstaben aus string 2 angehängt werden.

Wie mach ich das? Mir fällt absolut nichts ein...
 
Wie dir fällt nichts ein? du hast doch genau geschrieben was zutun ist.

Ansonsten riecht das verdammt nach hausaufgaben, und sowas wird hier nicht behandelt.


Also poste bitte ein konkretes problem....
 
das ist keine Hausaufgabe, sondern Prüfungsvorbereitung. Und es geht darum ,dass ich nicht mal weiß, wie ich an das Problem rangehen soll.

Also geht es um etwas generelles.

Oder bestimmst du, was ratschlagsrelevant ist? Ich hoffe nicht.

PS.: Wenn ich programmieren lernen will, muss ich übungsaufgben machen, und wenn ich da schon nicht weiter komme und niemanden fragen darf, wie soll ich da je vorankommen? außerdem, wie viele Treads von mir dazu gibt es schon? "Nerve" ich euch jeden Tag 100 mal? NEIN
 
Zuletzt bearbeitet:
PHP:
class TString
{
private:
	char data[20];
	
public:
	TString& operator+=( const TString& other );
	
	// zusätzliche Methoden?
};


TString& TString::operator+=( const TString& other )
{
	// Hier kommt dein Gehrinschmalz rein
	// Achte darauf die Länge von data nicht zu überschreiten (this->data + other->length() darf nicht größer als 20 sein)
	return this;
}
Hast du kein schlaues C++ Buch aus einer Bibliothek?
 
Zuletzt bearbeitet:
mh doch, ich kann mich damit zuschmeißen
hab auch schon so einige gewälzt...
mein Problem ist grad die verzweiflung, dass alles, was ich da reinschreibe mit 10^100 fehlermeldungen beantwortet wird.
 
Zeige dann doch mal deinen bisherigen Code und dazu passende Fehlermeldungen.
Versuche aber vorher alles an Code rauszucheißen, was für den Fehler nicht relevant ist.
Zeige uns also einen "minimierten" Code.
 
Code:
class TString
{
	char string[20];
public:
	//TString() {string='\0';}
	TString operator +=(TString NewObject)
	{
		TString Result;
		strcat(NewObject, Result);
		return Result;
	}
};

void main()
{
	TString s1("hallo"), s2("World"), s3;	//so dass in s1 und s3 "Hallo World" steht und in 
                                                                      s2 "Hallo"
	s3=(s1+=s2);
}

ich wette das ist totaler quatsch, was das steht... aber ich weiß es nicht besser...
Fehlermeldungen:
Code:
C:\Programme\Microsoft Visual Studio\MyProjects\pt2\pt2.cpp(57) : error C2664: 'strcat' : Konvertierung des Parameters 1 von 'class TString' in 'char *' nicht moeglich
        Kein benutzerdefinierter Konvertierungsoperator verfuegbar, der diese Konvertierung durchfuehren kann, oder der Operator kann nicht aufgerufen werden
C:\Programme\Microsoft Visual Studio\MyProjects\pt2\pt2.cpp(58) : warning C4172: Adresse einer lokalen Variablen oder eines temporaeren Wertes wird zurueckgegeben
C:\Programme\Microsoft Visual Studio\MyProjects\pt2\pt2.cpp(68) : error C2664: '__thiscall TString::TString(const class TString &)' : Konvertierung des Parameters 1 von 'char [6]' in 'const class TString &' nicht moeglich
        Ursache: Konvertierung von 'char [6]' in 'const class TString' nicht moeglich
        Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Ueberladungsaufloesung des Konstruktors ist mehrdeutig
C:\Programme\Microsoft Visual Studio\MyProjects\pt2\pt2.cpp(68) : error C2664: '__thiscall TString::TString(const class TString &)' : Konvertierung des Parameters 1 von 'char [6]' in 'const class TString &' nicht moeglich
        Ursache: Konvertierung von 'char [6]' in 'const class TString' nicht moeglich
        Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Ueberladungsaufloesung des Konstruktors ist mehrdeutig

:(
 
Code:
strcat(NewObject, Result);
Natürlich kannst du an strcat keine TStrings als Parameter übergeben ;)
'strcat' : Konvertierung des Parameters 1 von 'class TString' in 'char *' nicht moeglich

Du müsstest der Klasse eine Methode c_str() geben, die den Inhalt des Strings als char[] zurückgibt. Und einen Opertator= sodass du char[] in den TString schreiben kannst...

Oder irgendwie sowas halt :) Auf jeden Fall kannst du an strcat keine Tstrings übergeben

EDIT: Wo ist überhaupt der Sinn hinter deinem += Operator? Ich glaube du solltest deinen Code erstmal noch ernsthaft überdenken. So ist er nämlich ziemlich sinnentleert ;)
 
der code ist absolut sinnentleert, aber das sind nun mal die sachen, die unser Prof verlangt.. und die muss ich irgendwie verstehen, in der hoffnung, dass ich eines Tages programmieren kann *heul*
wenn es um zahlen, komplexe zahlen ginge, könnte ich damit eher was anfangen... aber is leider nicht so.

ich glaube ic müsste irgendwas schreiben, dass ich auf das char in der klasse zugreifen kann und irgendwie muss da auch ein konstruktor rein... vor allem wegen s3...

das ist der totale obermist... haben ein unverständliches fehlerhaftes skript, ein prof, der nicht erklären kann und übelst sinnbefreite übungsaufgaben. Prof kann man nicht fragen, weil dann nur kommt "was suchen sie dann überhaupt hier, wenn sie DAS schon nicht verstehen" ...
und kaum zeit :(
 
Hallo Latita,

halte dich mal an die Vorgabe von Boron, das ist doch schon die halbe Miete.

Und als "sinnbefreit" halte ich die Aufgabe nicht. Überladen von Operatoren ist etwas was Dir später noch öfter über den Weg laufen wird. Und das die Aufgabenstellung sinnvoll ist, sieht man ja daran das Du daran zu knabbern hast :-).

Nur das man den Prof nicht fragen kann ist sicher schlecht. Aber da gibt es es ja vielleicht noch Assistenten des Profs?

Und die Stelle hier, kann nicht funktionieren.
Code:
		TString Result;
		strcat(NewObject, Result);
		return Result;
Lies Dir mal die Beschreibung zu strcat durch. Das return this steht auch nicht ohne Grund im obigen Code.
Du änderst Die Kopie eines Parameters und gibst einen leeren String zurück.


MfG

Arnd
 
Zuletzt bearbeitet:
allerdings kann ich deinen prof gut verstehen ;). du weißt doch sogar schon wie es geht, hast es ja hier schon alles geschrieben was du brauchst. vielleicht solltest du nochmal überlegen was genau du machen willst, und es dann endlich in code aufschreiben....
 
Mir scheint du hast die Basics von OO-Programmierung nicht ganz verstanden, speziell das Prinzip der Kapselung.

Damit dein Vorhaben funktioniert kannst du nicht einfach die TString Objekte Concatenaten, sondern musst die "data" Variablen auslesen (entweder mit this fürs eigerne Objekt oder mit set- und get- Methoden).

Wie dem auch sei, auf dieser Seite wirst du alles finden was du brauchst.
http://www.highscore.de/cpp/aufbau/operatoren.html

lg
 
ich kann auch keine operatoren überladen ... :D und das nach 2 jahren C++ gibt in meinen augen auch wenig zeug das unnützer ist ;)
 
Dann kann ich Dir nur wünschen das Du in deinem Berufsleben nie an fremden Code arbeiten musst :-).

MfG

Arnd
 
riod schrieb:
ich kann auch keine operatoren überladen ... :D und das nach 2 jahren C++ gibt in meinen augen auch wenig zeug das unnützer ist ;)

bist du zufällig ("hauptberuflich") java programmierer? ich weiß ehrlich nicht was an lesbarem code unnütz ist, aber vielleicht willst du es mir ja erklären?
 
ich habe erst mal aufgegeben, nachdem ich stundenlang davor gesessen habe, so ungefähr weiß, was ich machen will, aber keinen blassen hab, wie ich anfange... und noch so viel anderes machen muss *heul*

Es gibt noch eine aufgabe, die mich schon seit tagen aufhält und ich find den fehler einfach nicht...

Es ist so deprimierend. Ich möchte es so gerne lernen, aber ich komme einfach nicht weiter.
Wenn er wenigstens greifbare Beispiele nehmen würde. So wie in meinem Buch: class Mitarbeiter und die Instanz Bill und so weiter... *kotz*

Ich werde wahrscheinlich durch die Prüfungen fallen und mal sehen, ich werde mich in den Semesterferien damit beschäftigen.
Oder, vielleicht bin ich auch falsch in der Branche... vielleicht sollte ich mir wieder einen Bürojob suchen *resignier*
 
Nix mit Resignation!

Nachdenken was du prinzipiell machen würdest um zwei Strings aneianderzuhängen.
"Pseudocode" schreiben (sinnvoller als man glaubt).
Wenn du gewisse "Zugriffe" machen möchtest, aber nicht weißt wie, vielleicht fehlen einfah nur Zugriffsmethoden, die du ja ergänzen kannst.
PHP:
TString& TString::operator+=( const TString& other )
{
    // Eventuell brauchst du noch zusätzliche Funktionen für die TString-Klasse

    if( this->länge + other->länge größer als 20 ) // hört sich irgendwie nach strlen(...) Funktion an ;-)
    {
       dann doof;
    }
    else
    {
        kopiere alle Bytes des other-Strings in das this-Object.
        Als Ziel aber mit dem  Byte "nach" dem letzen Zeichen des this-Strings anfangen.
        
        Das schreit nach einer Schleife mit geeigneter Abbruchbedingung ;-)
    }

    return this;
}
 
oder er nimmt ganz einfach strcat wie er es im ersten post schon geschrieben hat. dann kann er sich die ganze loop und if größe bla arbeit sparen ;).
ganz so primitiv ist C dann doch nicht :lol:.

also ehrlich. mach mal ein paar stunden was anderes, und versuch dann alles nochmal in code aufzuschreiben. alles was du brauchst steht hier im thread, von dir aufgeschrieben. andere haben auchnoch ein paar zeilen code beigesteuert, die schonmal einen großteil deiner worte implementieren. die letzten 2 zeilen sind nun wirklich nichtmehr kompliziert.
 
Zuletzt bearbeitet:
Zurück
Oben