Kein Zugriff auf private Member



  • Hi
    Also, ich hab ein Programm geschrieben welches mir einen string in eine liste einliest, und später wieder ausgibt.
    Zur Ausgabe wird << überladen, was aber noch nicht ganz funktioniert.

    Hier mal der code:

    int main() 
    { 
     astring str = "Hallo"; 
     cout << str << endl;
    cout << "Test" << endl;
     return 0; 
    } 
    
    class astring 
    { 
    struct buchstabenliste {
    		char buchstabe;
    		buchstabenliste *next;};
    buchstabenliste *beginn;
    
    public:
    astring (const char* text );
    
    friend ostream& operator<<(ostream&,astring);
    private: 
    }; 
    
    astring::astring(const char *s)      //einlesen
    {
    buchstabenliste *temp = new buchstabenliste;  
    buchstabenliste *anfang=temp;
    beginn=temp;
    
    for (int i=0;s[i]!='\0';i++)
    	{
    	(*temp).buchstabe=s[i];
    	(*temp).next=new buchstabenliste;
    
    	temp=temp->next;
    	(*temp).buchstabe='#';
    	}
    }
    
    ostream& operator<<( ostream& s, const astring& str )//ausgeben 
    {  
    		return s << str.beginn;
    }
    

    Jetzt kommt immer folgende meldung:

    error C2248: "astring::beginn": Kein Zugriff auf private Member, dessen Deklaration in der astring-Klasse erfolgte.

    wer kann helfen??



  • Bei deiner friend-Deklaration ist astring ein by value, bei der Operatordefinition eine konstante Referenz. Die beiden haben also ne unterschiedliche Signatur -> op<< ist kein friend.

    Du brauchst also einfach nur das zu schreiben:

    friend ostream& operator<<(ostream&,const astring&);
    


  • super...
    jetzt geht es.
    aber, jetzt gibt er mir keinen buchstaben des eingabetextes wieder, sondern lauter 6 "C".
    Muss bei der Ausgabe nicht sowas wie

    return s << (*beginn).buchstabe
    

    hin?

    nur das nimmt er nicht an



  • Was soll das !!! Wieso machst du extra einen neune Thread auf ?



  • Dein allererstes problem liegt in Zeile 3: Dein lustiger astring hat keinen Zuweisungsoperator...



  • kenner der dummköpfe schrieb:

    Dein allererstes problem liegt in Zeile 3: Dein lustiger astring hat keinen Zuweisungsoperator...

    quatsch in zeile 3 wird der konstruktor aufgerufen



  • physikus schrieb:

    Muss bei der Ausgabe nicht sowas wie

    return s << (*beginn).buchstabe
    

    hin?

    Eine Schleife wäre auch nicht schlecht. Oder willst du nur das erste Zeichen ausgeben?

    nur das nimmt er nicht an

    Das ist keine ausreichende Fehlerbeschreibung.



  • hallo

    ja, ich will zuerst mal den ersten buchstaben ausgeben damit ich seh ob es klapptt. danach kommt die schleife.
    Und diese Fehlermeldungen werden mir angezeigt

    1. : error C2065: 'beginn': nichtdeklarierter Bezeichner
      error C2228: Links von ".buchstabe" muss sich eine Klasse/Struktur/Union befinden.


  • Du darfst natürlich das "str." nicht weglassen.



  • return s << str.*beginn.buchstabe;
    

    genau die gleichen fehler

    return s << str.(*beginn).buchstabe;
    

    error C2059: Syntaxfehler: '('



  • Nimm doch einfach das Pfeilchen...



  • sollte es jemand interessieren, die Lösung:

    ostream& operator<<( ostream& s, const astring& str )     //ausgeben 
    { 
    		astring::buchstabenliste *temp=str.beginn;
    
    		return s << (*temp).buchstabe;
    


  • ich habe dir schon in deinem ersten thread gesagt das das speichern eines strings als zeigerverkette liste wohl der schlechteste ansatz ist.

    es sei denn du musst einen lehrer befriedigen.



  • inp schrieb:

    es sei denn du musst einen lehrer befriedigen.

    Gut erkannt 😉

    allesdings läuft meine schleife jetzt auch nicht.

    astring::buchstabenliste *temp=str.beginn;
    
    	while ((*temp).buchstabe!='\0')			//
    	{
    		return s << (*temp).buchstabe;
    		temp=temp->next;
    

    Das "H" bekomme ich zwarausgegeben, aber dann ist schluss.
    kein zweiter schleifendurchlauf



  • Das liegt daran dass die Funktion bei "return" beendet wird.



  • ja, und wie mach ich das ohne return????



  • Nun, indem Du nicht "return" schreibst. Return beendet nunmal die Funktion und legt den Rückgabewert fest. Vermutlich solltest Du in der Schleife einfach nur die Ausgabe auf den Stream machen und anschließend, nach Abarbeitung der Schleife, die Rückgabe mit "return s;" auslösen.



  • Edit: Unsinn.



  • physikus schrieb:

    ja, und wie mach ich das ohne return????

    Hi,

    überleg' doch mal kurz, was Du eigentlich machen möchtest bei der Ausgabe: Möchtest Du EINMAL einen Buchstaben ausgeben ? Oder möchtest Du ALLE Buchstaben ausgeben ?

    In Deinem Statement s << (*temp).buchstabe; wird nur auf EINEN Buchstaben verwiesen ... (*)

    physikus schrieb:

    sollte es jemand interessieren, die Lösung:

    ostream& operator<<( ostream& s, const astring& str )     //ausgeben 
    { 
    		astring::buchstabenliste *temp=str.beginn;
    
    		return s << (*temp).buchstabe;
    

    BTW: temp->buchstabe hätte es auch getan. ... oder gar direkt (temp braucht man nicht): str.beginn->buchstabe 😃

    Gruß,

    Simon2.

    (*) HINT: Stichwort ist "Schleife".



  • struct buchstabenliste { 
       char buchstabe; 
       buchstabenliste *next;
    
       friend std::ostream & operator<<(std::ostream & os, buchstabenliste const * bs)
       {
          if (bs != 0) {
             os << bs->buchstabe << bs->next;
          }
          return os;
       }
    };
    
    //------------
    
    ostream& operator<<( ostream& os, const astring& str )
    { 
       return os << *str.beginn;
    }
    


  • Hi Helium,

    das löst aber noch nicht physikus' "Problem des ersten Buchstabens"...

    Gruß,

    Simon2.


Anmelden zum Antworten