Bitte um Erklärung bezüglich Operator überladung



  • Hey @all,

    ich weiß es gibt mehrere Arten, die eine ist sie in eine Klasse zu schreiben, und die andere, das man Sie als Funktion behandelt:

    Hier mal mein Testprogramm:
    main.cpp:

    #include "ko.hpp"
    
    using namespace std;
    
    int main(int argc, char* argv[]) {
      CText t("Test");
      cout << t << endl;
    }
    

    ko.cpp

    #ifndef KO_HPP
    #define KO_HPP
    
    #include <iostream>
    #include <string>
    
    class CText {
      private:
        std::string str;
        char* m_pText;
      public:
        CText(char*);
        void printOn(std::ostream& strm);
        friend std::ostream& operator<< (std::ostream&, CText&);
    };
    
    #endif
    

    ko.cpp

    #include "ko.hpp"
    
    using namespace std;
    
    CText::CText(char* text) {
      str = text;
      m_pText = new char[sizeof(text)+1];
      strcpy(m_pText, text);
    }
    
    void CText::printOn(ostream& strm) {
      strm << '(' << m_pText << ')';
    }
    
    ostream& operator<< (ostream& os, const CText& p) {
      p.printOn(os);
      return os;
    };
    

    Fehlermeldung:

    ko.cpp: In function `std::ostream& operator<<(std::ostream&, const CText&)':
    ko.cpp:16: error: passing `const CText' as `this' argument of `void
       CText::printOn(std::ostream&)' discards qualifiers
    

    Kann mir bitte jemand erklären warum das nicht funktioniert, und mir für beide Arten ein Beispiel zur verfügung stellen

    Vielen dank im Voraus
    Lg _freeze_



  • printOn sollte const sein:
    [cpp]
    void printOn(std::ostream& os) const;
    [/cpp]



  • danke, habe ich gemacht, nur kommet jetzt folgendes_

    In function `main':
    main.cpp:8: undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, CText&)'
    

    Lg _freeze_



  • Die friend-Deklaration des Operators stimmt nicht mit der Definition überein (wieder ein const-Problem). Vielleicht solltest du mal einen Gang zurückschalten und dir solche Sachen nochmal angucken. IMHO hättest du das nämlich leicht selbst finden können.

    BTW: Da der Operator keine privaten Members von CText anspricht, braucht er kein friend zu sein.


Anmelden zum Antworten