Fehler: »...« wurde in diesem Gültigkeitsbereich nicht definiert



  • Was ist der Fehler in dieser Klasse?

    Ich habe doch readFile(QString & file) public gemacht.

    // filewriter.h -- Class prototyp for using files in easybill
    
    #ifndef FILEWRITER_H
    #define FILEWRITER_H
    
    #include <QString>
    #include <QFile>
    #include <vector>
    
    class Filehandler
    {
    private:
    	QString pathtofile;
    
    public:
    	// e. g: Filewriter("bills", "2.txt");
    	Filehandler(QString & dir, QString & filename);
    	Filehandler(QString & dir);
    
    	QString nextFileInDir(QString & dir);
    
    	void writeNewLine(QString & text);
    
    	std::vector<QString> readFile();
    	std::vector<QString> readFile(QString & file);
    
    	std::vector< std::vector<QString> > readAllFilesFromDir(QString & dir);
    
    };
    
    #endif
    
    ...
    
    std::vector< std::vector<QString> > readAllFilesFromDir(QString & dir)
    {
    	QDir dirdestination(dir);
    	QFileInfoList list = dirdestination.entryInfoList();
    
    	QString filename;
    	QString destination;
    	std::vector< std::vector<QString> > v1;
    	std::vector<QString> v2;
    	for(int i = 0; i < list.size(); ++i)
    	{
    		QFileInfo fileInfo = list.at(i);
    		filename = QString("%1").arg(fileInfo.fileName());
    		destination = dir + filename;
    
                    /** HIER IST DER FEHLER **/
                    v2 = readFile(&destination); 
    
    		v1.push_back(v2);
    	}
    
    	return v1;
    }
    
    std::vector<QString> Filehandler::readFile()
    {
    	return readFile(pathtofile);
    }
    
    std::vector<QString> Filehandler::readFile(QString & file)
    {
    	QFile data(file);
    
    	QString line;
    	std::vector<QString> v;
    
    	if(data.open(QFile::ReadOnly))
    	{
    		QTextStream in(&data);
    
    		do
    		{
    			line = in.readLine();
    			v.push_back(line);
    		} while(!line.isNull());
    	}
    
    	return v;
    }
    
    make -j2
    g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -DQT_WEBKIT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++-64 -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -o filehandler.o filehandler.cpp
    filehandler.cpp: In Funktion »std::vector<std::vector<QString> > readAllFilesFromDir(QString&)«:
    filehandler.cpp:71:29: Fehler: »readFile« wurde in diesem Gültigkeitsbereich nicht definiert
    make: *** [filehandler.o] Fehler 1
    

  • Mod

    std::vector< std::vector<QString> > readAllFilesFromDir(QString & dir)
    

    ->

    std::vector< std::vector<QString> > Filehandler::readAllFilesFromDir(QString & dir)
    

    Höre ich gerade von ferne einen Kopf auf eine Tischplatte knallen? 🙂

    P.S.: Irgendwie kommt mir übrigens die Aufgabenteilung deiner Klassen und Funktionen komisch vor. Ich schätze, so einiges davon sollte wohl eher als freie Funktionen implementiert werden. Eigentlich sogar so ziemlich alles, was du derzeit zeigst.



  • Filehandler::readFile() ist eine nicht statische Methode und erfordert daher ein Objekt. Je nachdem was gewünscht ist musst du die Methode entweder auf einem Objekt aufrufen oder static deklarieren.

    Edit: Oder die dritte vom SeppJ beschriebene Methode, die wahrscheinlich das ist, was du machen wolltest.



  • Au ja. Ganz blöder Flüchtigkeitsfehler. Danke.

    Aber wieso wäre es besser nur Methoden statt eine Klasse zu schreiben?

    Ich brauche diese Klasse, um Daten zeilenweise aus mehreren Dateien in einem Ordner auszulesen. Oder halt nur aus einer einzigen Datei.

    Sorry, bin noch relativ neu, was C++ angeht, bitte hackt nicht auf mir rum 🙂



  • ubik schrieb:

    Aber wieso wäre es besser nur Methoden statt eine Klasse zu schreiben?

    Die Klasse hat nur public Methoden und nur eine Privates Datatmember von dem nicht ganz klar ist, wozu es überhaupt gebraucht wird. Da liegt der Verdacht nah, dass das alles auch mit freien Funktionen ginge.



  • ubik schrieb:

    Aber wieso wäre es besser nur Methoden statt eine Klasse zu schreiben?

    Weil ein Objekt im Allgemeinen Daten hat (hier: nur pathtofile ). Zwei Deiner "Methoden" nutzen dieses einzige Datum noch nicht einmal, und weder haben deren "Ergebnisse" etwas mit dem Objekt zu tun noch manipulieren sie dessen Daten.

    Interessant, ich habe bei einem Projekt mal genau exakt so einen gleichnamigen "Filehandler" in genau solche freien Funktionen zerlegt, aus genau diesen Gründen.

    ubik schrieb:

    Ich brauche diese Klasse, um Daten zeilenweise aus mehreren Dateien in einem Ordner auszulesen. Oder halt nur aus einer einzigen Datei.

    (Fett von mir)
    Dann sollte sich die Klasse ggf. auf diese spezielle Aufgabe konzentrieren und das simple Einlesen einer Datei der Funktion überlassen, die nichts weiter braucht als einen Dateinamen.


  • Mod

    minastaros schrieb:

    ubik schrieb:

    Ich brauche diese Klasse, um Daten zeilenweise aus mehreren Dateien in einem Ordner auszulesen. Oder halt nur aus einer einzigen Datei.

    (Fett von mir)
    Dann sollte sich die Klasse ggf. auf diese spezielle Aufgabe konzentrieren und das simple Einlesen einer Datei der Funktion überlassen, die nichts weiter braucht als einen Dateinamen.

    An sich halte ich es schon komisch, eine "Aufgabe" in eine Klasse zu packen. Ein Klassenobjekt sollte irgendein "Ding" repräsentieren, so etwas wie eine Aufgabe passt eher zum Begriff einer Funktion oder, falls diese Aufgabe ein Ding benötigt, eine Memberfunktion. Hier identifiziere ich das Ding als die "mehreren Dateien" und die Aufgabe als "auslesen". Daher würde ich vorschlagen, dass die Klasse das Konzept mehrerer Dateien modellieren sollte, das Auslesen kann dann eine (Member)Funktion dieser Klasse sein.

    Dies unter dem Vorbehalt, dass es in dem Programm irgendwie Sinn macht, mit der "mehrere Dateien"-Klasse auch noch irgendetwas anderes zu tun. Wenn die einzige Art und Weise der Benutzung nach der Art

    {
      MultiFile mf(list_of_file_names);
      mf.read(data);
    }
    

    verläuft (also einmaliges Benutzen einer Instanz, dann wegwerfen), dann ist das immer noch besser als freie Funktion anzusehen, in der man den Konstruktor und die read-Funktion aus obigem Beispiel einfach in eine Funktion zusammen fasst:

    data = multi_file_read(list_of_file_names);
    


  • SeppJ schrieb:

    An sich halte ich es schon komisch, eine "Aufgabe" in eine Klasse zu packen. [...]

    Gebe Dir recht. Saloppe Spät-Abends-Formulierung.
    Da wir ja noch nicht wissen, was denn die Kernaufgabe des Programms/Moduls mit den vielen Dateien ist, setzte ich "Aufgabe" etwas nachlässig als Synonym für das Ding an, wo wirklich was Spannendes passiert und DATEN 😉 entstehen. Dort also, wo Dein data zu Hause ist.


Anmelden zum Antworten