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


Log in to reply