wieder mal probleme beim überladen (+)



  • hier nochmal die ausgabe

    ostream& operator<<( ostream& s, const astring& str )		   //ausgeben 
    {
    	astring::buchstabenliste *temp=str.beginn;
    
    	while ((*temp).buchstabe!='#')			//
    	{
    		  s << (*temp).buchstabe; 
            temp=temp->next;
    	}
    	return s;
    }
    

    Den kompletten code hab ich aber auch schonmal gepostet.



  • physikus schrieb:

    Den kompletten code hab ich aber auch schonmal gepostet.

    Inklusive aller in den folgenden zwei Seiten vorgeschlagenen Änderungen? Wie wärs wenn Du mal die Puzzlearbeit selbst machst und nicht uns die erledigen lässt. Also, poste doch einfach mal in einem Post zusammengefasst:

    1. Allen relevanten Sourcecode
    2. Die vollständige Fehlermeldung
    3. Falls die Zeilennummern nicht übereinstimmen exakte Angaben worauf die Meldungen sich beziehen.



  • OK, hier die main

    // stringtest.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    
    #include "string.h" 
    #include <iostream>
    
    //extern buchstabenliste *beginn1;
    int main() 
    {
     astring str1 = "Hallo"; 
     astring str2 = " Welt";
     astring str3;
     cout << str1+str2  << endl<< endl;
    
     int länge1=str1.lenght();
     int länge2=str2.lenght();
    
     cout << str1 << endl << str2  << endl<< endl ;
     cout << "Die Laenge des ersten strings ist " << länge1 << " Zeichen" << endl<< endl;
     cout << "Die Laenge des zweiten strings ist " << länge2 << " Zeichen" << endl<< endl;
    
     return 0; 
    }
    

    include file

    // stringtest.h: Master include File 
    
    #ifndef STRINGTEST_H_INCLUDED_
    #define STRINGTEST_H_INCLUDED_
    
    #include <iostream>
    #include "string.h"
    using namespace std;
    #endif // define STRINGTEST_H_INCLUDED_
    

    Klasse

    // string.h: Schnittstelle für die Klasse astring
    #include <iostream>
    using namespace std;
    
    #pragma once
    class astring 
    { 
    struct buchstabenliste {
    		char buchstabe;
    		buchstabenliste *next;};
    
    public:
    
    astring ();														//Konstruktor
    
    astring (const char* text );									//Konstruktor
    
    ~astring ();
    
    int lenght();													// gibt die Länge aus
    
    friend ostream& operator<<(ostream&,const astring& str);		//überladen <<
    
    astring operator+(const astring& lhs,const astring& rhs);
    
    private: 
    int size;
    buchstabenliste *beginn;										// beginn der struktur
    };
    

    und die methoden

    // string.cpp: Implementierung der Klasse rational.
    //
    //////////////////////////////////////////////////////////////////////
    
    #include "string.h" 
    
    astring::astring()											  //Konstruktor ohne wert
    {}
    astring::astring(const char *s)								 //Konstruktor einlesen
    {
    	buchstabenliste *temp = new buchstabenliste;  
    	beginn=temp;
    	size=0;
    	for (int i=0;s[i]!='\0';i++)
    		{
    		size++;
    		(*temp).buchstabe=s[i];
    		(*temp).next=new buchstabenliste;
    		temp=temp->next;
    		(*temp).buchstabe='#';
    		}
    }
    astring::~astring()											   //Destruktor
    {}
    int astring::lenght()
    {
    	return size;
    	return 0;
    }
    
    astring operator+(const astring& lhs,const astring& rhs);
    
    { 
      //astring tmp=lhs; 
      //return tmp+=rhs;
    	return lhs;
    }
    /**/
    
    ostream& operator<<( ostream& s, const astring& str )		   //ausgeben 
    {
    	astring::buchstabenliste *temp=str.beginn;
    
    	while ((*temp).buchstabe!='#')			//
    	{
    		  s << (*temp).buchstabe; 
            temp=temp->next;
    	}
    	return s;
    }
    

    so, das wärs, zeilenangaben stimmen alle. Hoffe ihr könnt damit was anfangen und jemand kann mir helfen. Die fehler wären dann

    1>------ Erstellen gestartet: Projekt: stringtest, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>string.cpp
    1>e:\studium\2. semester\git ii\eigene software\stringtest\stringtest\string.h(24) : error C2804: Binärer Operator '+' hat zu viele Parameter
    1>e:\studium\2. semester\git ii\eigene software\stringtest\stringtest\string.cpp(33) : error C2447: '{': Funktionskopf fehlt - Parameterliste im alten Stil?
    1>stringtest.cpp
    1>e:\studium\2. semester\git ii\eigene software\stringtest\stringtest\string.h(24) : error C2804: Binärer Operator '+' hat zu viele Parameter
    1>e:\studium\2. semester\git ii\eigene software\stringtest\stringtest\stringtest.cpp(13) : error C2676: Binärer Operator '+': 'astring' definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nicht
    1>Code wird generiert...
    1>Das Buildprotokoll wurde unter "file://e:\Studium\2. Semester\GIT II\Eigene Software\stringtest\stringtest\Debug\BuildLog.htm" gespeichert.
    1>stringtest - 4 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    Compiler: Visual C++ 2005 Express



  • Du mußt den zweistelligen operator+(x, y) außerhalb deiner Klasse definieren, oder aber daraus einen einstelligen machen, der einen impliziten this-Zeiger enthält.



  • kannst du mir ein biesiel geben wie das dann aussieht?
    was wäre denn besser? innerhalb oder außerhalb???



  • astring operator+(const astring& lhs,const astring& rhs);
    

    Diese Zeile aus der Klasse raus nehmen. Und irgendwo außerhalb der Klasse platzieren.



  • so, endlich..... jetzt funktioniert es so halbwegs... kann das programm jetz laufen lassen ... keine fehler mehr..... jetz muss ich nur die methode selbst noch richtig implementieren ......

    astring operator+(const astring& lhs,const astring& rhs);
    

    --> ausehalb der klasse

    astring operator+(const astring& lhs,const astring& rhs)				   
    { 
      //astring tmp=lhs; 
      //return tmp+=rhs;
    	return lhs;
    


  • physikus schrieb:

    so, endlich..... jetzt funktioniert es so halbwegs... kann das programm jetz laufen lassen ... keine fehler mehr..... jetz muss ich nur die methode selbst noch richtig implementieren ......

    gut gesagt mit dem "nur noch".....

    wie mach ich das denn mit dem ausgeben?
    sobald ich z.b return lhs da rein schreibe beendet er das ganze....
    gibts da noch einen trick dabei?

    weil auf den lhs.beginn kann ich auch nicht zugreifen...

    astring::buchstabenliste *temp=str.beginn;
    

    dann sagt er mir immer

    rror C2248: "astring::buchstabenliste": Kein Zugriff auf private struct, dessen Deklaration in der astring-Klasse erfolgte.



  • hat keiner eine idee???



  • Ich würd zuallererst mal einen copy ctor mit reinbringen. Den brauchst du hier sowiso um "flatcopies" zu vermeiden.



  • 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, 42

    der 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 Fehler

    1>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:
    mein

    lhs.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?


Anmelden zum Antworten