Zwei Strings mit Friend-Funktion aus zwei Klassen zusammenfügen ?



  • #include <iostream>
    #include <cstring>
    using namespace std;
    
    class Zeichen
    {
    private:
        char * qText;
        friend char freund(char *qText, char *pText);
    public:
        Zeichen (char *f)
        {
            qText = new char[strlen(f)+1];
            strcpy(qText,f);
        }
        ~Zeichen()
        {
            delete[]qText;
        }
    };
    char freund (char *qText e, char *pText g)
    {
        return e.qText+g.pText;
    }
    class Zeichenketten
    {
    private:
        char * pText;
         friend char freund(qText,pText);
    public:
        Zeichenketten(char * s)
        {
            pText = new char[strlen(s)+1];
            strcpy(pText,s);
        }
        ~Zeichenketten()
        {
            delete []pText;
        }
        void drucken()
        {
            cout << pText << '\n';
        }
    };
    
    
    int main ()
    {
        Zeichenketten z1="Ein Ninja kommt selten allein";
        Zeichen z2="Aber mit Mayonaise schon";
        cout << "\n" << freund(z1, z2);
    
        return 0;
    }
    

    // Ich wollte versuchen zwei Strings zusammenzufügen mithilfe einer Friend-Funktion.
    Also das ich ein ein String in einer Klasse erstelle und noch einen String aus einer anderen Klasse zusammenfüge.
    Also zwei einzelne Strings zu einem String zusammenfüge und ausgeben lasse



  • Hast du auch eine Frage?

    Verwende std:::string, nicht char arrays und new!



  • @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 der main-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.


Log in to reply