Zwei Strings mit Friend-Funktion aus zwei Klassen zusammenfügen ?
-
@manni66 Zwei Strings mit Friend-Funktion aus zwei Klassen zusammenfügen ?
-
@NewbieCoding sagte in Zwei Strings mit Friend-Funktion aus zwei Klassen zusammenfügen ?:
@manni66 Zwei Strings mit Friend-Funktion aus zwei Klassen zusammenfügen ?
Ein ? macht aus Wörtern keine Frage.
-
Und deine freie
friend
-Funktion sollte wohl auch eher so aussehen (wenn es dem Aufruf aus dermain
-Funktion entsprechen soll):friend std::string freund(const Zeichenketten &zk, const Zeichen &z);
Und warum hast du überhaupt 2 Klassen, welche (fast) dasgleiche machen (auch die Benennung deutet darauf hin)?
PS: Deine bisherige
friend
-Funktion gibt nur ein einzelnes Zeichen (char
) zurück...
-
@NewbieCoding sagte in Zwei Strings mit Friend-Funktion aus zwei Klassen zusammenfügen ?:
char * qText;
Das ist kein String. Das ist ein pointer to
char
.@NewbieCoding sagte in Zwei Strings mit Friend-Funktion aus zwei Klassen zusammenfügen ?:
pText = new char[strlen(s)+1];
Total gaga.
Aber wennschon ... Rule of 3/5?
@NewbieCoding sagte in Zwei Strings mit Friend-Funktion aus zwei Klassen zusammenfügen ?:
e.qText+g.pText;
addiert zwei Pointer was ziemlich sinnfrei ist.
#include <cstddef> // std::size_t #include <cstring> // std::strlen(), std::strcpy(), std::strcat() #include <utility> // std::swap() #include <iostream> // der andere Kaese. class string { std::size_t length = 0; char *str = nullptr; public: string() = default; string(char const *text) : length{ text ? std::strlen(text) : 0 }, str{ length ? new char[length + 1]{} : nullptr } { text && std::strcpy(str, text); } string(string const &other) : length { other.length }, str{ length ? new char[length + 1]{} : nullptr } { other.str && std::strcpy(str, other.str); } string& operator=(string other) // copy 'n swap ist toll { std::swap(length, other.length); std::swap(str, other.str); return *this; } ~string() { delete[] str; } friend string operator+(string const &, string const &); friend std::ostream& operator<<(std::ostream &, string const &); }; string operator+(string const &lhs, string const &rhs) { auto length{ lhs.length + rhs.length }; string result; result.str = new char[length + 1]; result.length = length; std::strcpy(result.str, lhs.str); std::strcat(result.str, rhs.str); return result; } std::ostream& operator<<(std::ostream &os, string const &str) { if (str.str) os << str.str; return os; } int main() { string z1 = "Ein Ninja kommt selten allein"; string z2 = "\nAber mit Mayonaise schon"; std::cout << z1 + z2 << '\n'; }
-
@Swordfish Ich weiß nicht warum, aber anscheinend sind alle immer auf Angriff aus. Ich bin noch nicht erfahren und will es lernen. Komm mir vor als dürfte ich gar keine Frage mehr stellen oder wissen, ob sowas überhaupt funktioniert.
Ich werd es nicht mit dem Zeiger machen und belass es mit einer String verkettung außerhalb der klasse mit strcat
-
@NewbieCoding Außerhalb einer Klasse, als Teil einer Klasse, es ist egal. Der springende Punkt ist daß Du das kopieren musst worauf die Zeiger zeigern. Zwei Zeiger zu addieren macht nie Sinn und ist soweit ich weiß auch undefiniert was dabei rauskommt. Ist irgendwie so als würde man die Hausnummern von zwei Wohnanschriften addieren. Kann man machen (rein technisch) aber wer da dann wohnt?
-
@Swordfish Das macht wenig Sinn, da hast du Recht. Also wenn es um Strings geht, dacht ich könnte die Zeiger bzw "Ein Array" darauf zeigen lassen und die dann später zu einem Satz zusammenfügen.
-
Wie würdest Du denn die Arrays
int foo[] = { 1, 2, 3 }; // und int bar[] = { 4, 5, 6, 7 };
zusammenfügen?
-
@Swordfish ich denke, da muss man die zwei arrays in einem array reinkopieren. Hab ich noch nicht gemacht.
-
Dann mach mal. Vielleicht geht Dir dann bezüglich Deiner Strings auch ein Licht auf.