operator<< überladen
-
Ich möchte mir für die Ausgabe meiner MySQL Abfragen ein Objekt erstellen das mir das ganze in eine Datei ausgibt. dazu will den Operator << überladen. Derzeit mach ich das ganze etwas unschön alles zusammen in einer Methode(ohen Objekt - im grunde will ich die druckausgabe jetzt objektbasiert erledigen):
void outputDB() { //Elemente für die Liste #define header "-------------------------------------------------------------------------------\n| ID| Nachname| Vorname| Geb|\n-------------------------------------------------------------------------------\n" #define footer "*********************************Ende der Liste********************************"; std::ofstream file("Mitarbeiter.dat"); //Objekte für Datenbankabfrage erzeugen ConnectDB* myConnection = createConnection(); SendRequestDB myReq; myReq.result = myReq.selectAll(myConnection->pConnection); destroyConnection(myConnection); //Spaltenanzahl ermitteln myReq.numCol = (unsigned long int) mysql_num_fields(myReq.result); //Größe der Felder, für die Ausgabe in den filestream int colSize[4] = {5,30,30,10}; //Datei mit Daten füllen file<<header; while(myReq.rowContent = mysql_fetch_row(myReq.result)) { for(unsigned long int i = 0; i<myReq.numCol; ++i) { file<<std::setw(colSize[i])<<myReq.rowContent[i]<<"|"; } //Zeilenumbruch file<<"\n"; } //Fuß drucken file<<footer; file.close(); }
Ich möchte mir jetzt ein Objekt PrintDB erstellen und dann mit dem << Operator die Informationen in datei umleiten. hab mir die klasse mal so aufgebaut:
class PrintDB { private: #define header "-------------------------------------------------------------------------------\n| ID| Nachname| Vorname| Geb|\n-------------------------------------------------------------------------------\n" #define footer "*********************************Ende der Liste********************************"; public: char filename[50]; std::string getHeader(){ return header;} std::string getFooter(){ return header;} friend std::ostream& operator<<(std::ostream &stream, PrintDB &); PrintDB(); ~PrintDB(); };
.cpp
PrintDB::PrintDB() { std::cout<<"Geben Sie bitte einen Dateiname ein: "; std::cin>>filename; std::cin.ignore(1,'\n'); } std::ostream&::operator <<(std::ostream & stream, PrintDB &oPrintDB) { return stream << oPrintDB.getHeader(); } PrintDB::~PrintDB() { std::cout<<"Aufruf des PrintDB DEstruktor"<<std::endl; }
Aber das ist nichts, der compiler wirft tonnenweiese fehlermeldungen aus:
\printdb.cpp(17) : error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'std::string' (or there is no acceptable conversion)
c:\program files\microsoft visual studio 8\vc\include\ostream(650): could be 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)' [found using argument-dependent lookup]
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
c:\program files\microsoft visual studio 8\vc\include\ostream(697): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,char)' [found using argument-dependent lookup]
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
c:\program files\microsoft visual studio 8\vc\include\ostream(735): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)' [found using argument-dependent lookup]
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
c:\program files\microsoft visual studio 8\vc\include\ostream(782): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,char)' [found using argument-dependent lookup]
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
c:\program files\microsoft visual studio 8\vc\include\ostream(906): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const signed char *)' [found using argument-dependent lookup]
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
c:\program files\microsoft visual studio 8\vc\include\ostream(913): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,signed char)' [found using argument-dependent lookup]
with
[
_Elem=char,
_Traits=std::char_traits<char>
]Denke ich hab da ein Verständnisproblem, wie müsste sowas aussehen, damit ich alle daten die gedruckt werden sollen einfach mit << an das PrintDB Objekt übergeben werden können?
-
Hast du möglicherweise eine Header vergessen einzubinden? (weil, nach meinem Wissen sollte es einen op<<(ostream&, string) geben)
-
std::ostream&::operator <<(std::ostream & stream, PrintDB &oPrintDB) { return stream << oPrintDB.getHeader(); }
Mir kommt diese Konstruktion etwas sehr suspekt vor, besonders der Scope-op...
Besser:
std::ostream& operator <<(std::ostream & stream, const PrintDB &oPrintDB) { return stream << oPrintDB.getHeader(); }
Im Übrigen kannst du die friend Deklaration auch wieder rausnehmen, schließlich überlädst du den op ja global und verwendest keine privaten Daten der Klasse.
MfG
GPC