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.