wieder mal probleme beim überladen (+)
-
David_pb schrieb:
Ich würd zuallererst mal einen copy ctor mit reinbringen. Den brauchst du hier sowiso um "flatcopies" zu vermeiden.
was bitte ist ein copy ctor??
-
physikus schrieb:
David_pb schrieb:
Ich würd zuallererst mal einen copy ctor mit reinbringen. Den brauchst du hier sowiso um "flatcopies" zu vermeiden.
was bitte ist ein copy ctor??
eine konstruktor, der eine instanz der klasse als parameter akzeptiert und das neue objekten mit den werten des übergebenen objekts instanziiert.
die sind nötig, sobald member pointer sind. denn sonst erstellt der compiler einen default copy ctor, der "flache" kopien erstellt. d.h. er kopiert für pointer nicht das, worauf der pointer zeigt, sondern einfach die adresse.
beispiel:
class A { public: A *anotherA; int value; A(){} A(int value) : value(value){ anotherA = new A; anotherA->value = value; } void print(){ cout << value << ", " << anotherA->value << endl; } }; int main(){ A a(23); A b(a); b.anotherA->value = 42; a.print(); b.print(); }
ausgabe:
23, 42
23, 42der wert wurde eigentlich nur für das objekt b geändert, da der pointer auf anotherA allerdings "flach" kopiert wurde, zeigen beide instanzen auf dasselbe objekt.
copy ctor eingefügt
A(const A &a){ value = a.value; anotherA = new A(a.value); }
erhält man die erwartete ausgabe von:
23, 23
23, 42
-
Hmm.. versteh ich nicht...
Aber hat das überhaupt was mit meinem Problem zu tun, das ich nicht weis wie ich die 2 strings aneinander fügen soll?das muss doch auch einfacher gehen?
-
so, da das nicht klappt will ich jetzt den +operator innerhalb der klasse überladen
public: astring (); //Konstruktor astring (const char* text ); //Konstruktor ~astring (); int lenght(); // gibt die Länge aus buchstabenliste *beginn; astring operator+(const astring& lhs);
astring::buchstabenliste * Getstring ();
will ich dann dazu benutzen um an den zweiten wert ran zu kommen.
hier dann die methoden:astring operator+(const astring& lhs) { //hier kommt jetzt irgenwas hin mit dem astring::Getstring, nur was????? return lhs;} astring::buchstabenliste * astring::Getstring() { return astring::beginn; }
Ist das prinzipiell so richtig wie ich mir das denke???
Denn leider kommt immer folgender Fehler1>stringtest.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: class astring __thiscall astring::operator+(class astring const &)" (??Hastring@@QAE?AV0@ABV0@@Z)" in Funktion "_main".
1>E:\Studium\2. Semester\GIT II\Eigene Software\stringtest\Debug\stringtest.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
-
das fehlt noch im public teil
astring::buchstabenliste * Getstring ();
-
astring astring::operator +(const astring& lhs) { //hier kommt jetzt irgenwas hin mit dem astring::Getstring return lhs;}
-
kann mir denn jetzt da keiner mehr weiterhelfen???
-
Ne. Weil du auf die Art sowiso nicht weiterkommst. An deiner Stelle würd ich mir mal einige Grundlagen aneignen.
-
wie komme ich nicht weiter? und welche grundlagen?
hab das jetzt schon in einigen büchern nachgelesen und da steht das immer so drin wie ich das jetzt gemacht hab.
main astring str3=str1+str2; public: astring (); //Konstruktor astring (const char* text ); //Konstruktor ~astring (); int lenght(); // gibt die Länge aus buchstabenliste *beginn; astring::buchstabenliste * Getstring (); astring operator+(astring lhs); methoden astring::buchstabenliste * astring::Getstring() { return astring::beginn; } astring astring::operator +(astring lhs) { astring::buchstabenliste *b = astring::Getstring(); astring::buchstabenliste *a = lhs.beginn; cout <<(*a).next->buchstabe; //nur zum testen cout <<(*b).next->buchstabe; //nur zum testen astring str3=lhs; return lhs; }
Damit kann ich jetzt sogar auf die einzelnen buchstaben beider astrings zugreifen. ich weiß jetzt halt nur nicht wie ich die buchstaben als "typ astring" zurück geben kann.
oder anders:
meinlhs.beginn
ist ja ein zeiger auf das erste element meiner buchstabenliste. nun will ich diesen zeiger so dereferenzieren das ich nur noch eine variable vom typ astring habe. und das weiß ich nicht wie das geht.
-
kann mir denn wirklich niemenad mal einen vernünfigen tipp, hinweis oder ein beispiel zeigen wie das geht?
-
ich glaube das problem ist zum teil, dass zumindest ich mit deinem quelltext sehr wenig anfangen kann. der ist so unvollständig und falscher syntax, dass ein fehler quasi überall sein könnte. einen zeiger zu dereferenzieren sollte jedoch nicht das problem sein und mit einem "&" bzw "*" vor der variable getan sein, je nachdem was du nun tatsächlich tun willst.