Nicht deklarierter Bezeichner trotz Deklaration



  • Hallo zusammen,

    ich lerne gerade C++ und lese dazu ein Buch und schreibe begleitend dazu immer ein kleines Programm.
    Doch jetzt bekomme ich immer Fehler und ich finde einfach nicht die Ursache. Wahrscheinlich sehe ich den Wald vor lauter Bäumen nicht.

    BinaryReader.h

    #pragma once
    class BinaryReader
    {
    private:
    	ifstream* _reader;
    
    public:
    	BinaryReader(char const*);
    	BinaryReader(ifstream*);
    	~BinaryReader();
    	char ReadChar();	
    };
    

    BinaryReader.cpp

    #include <fstream>
    #include <stdlib.h>
    #include "BinaryReader.h"
    
    using namespace std;
    
    BinaryReader::BinaryReader(char const* fileName)
    {
    	_reader = new ifstream(fileName, ios::binary);
    }
    
    BinaryReader::BinaryReader(ifstream* stream)
    {
    	_reader = stream;
    }
    
    BinaryReader::~BinaryReader()
    {
    	delete _reader;
    }
    
    char BinaryReader::ReadChar()
    {
    	char value;
    	_reader->read((char*)&byte, sizeof(value));
    	return value;
    }
    

    Wenn ich nun komiliere bekomme ich folgende Fehler.

    Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
    Fehler C2065 "_reader": nichtdeklarierter Bezeichner ELF elf\binaryreader.cpp 9
    Fehler C2511 "BinaryReader::BinaryReader(std::ifstream )": Überladene Memberfunktion nicht in "BinaryReader" gefunden ELF elf\binaryreader.cpp 13
    Fehler C2541 "delete": Objekte, die keine Zeiger sind, können nicht gelöscht werden ELF elf\binaryreader.cpp 20
    Fehler C2065 "_reader": nichtdeklarierter Bezeichner ELF elf\binaryreader.cpp 14
    Fehler C2065 "_reader": nichtdeklarierter Bezeichner ELF elf\binaryreader.cpp 20
    Fehler C2065 "_reader": nichtdeklarierter Bezeichner ELF elf\binaryreader.cpp 26
    Fehler C4430 Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. ELF elf\binaryreader.h 5
    Fehler (aktiv) Keine Instanz von Überladene Funktion "BinaryReader::BinaryReader" stimmt mit dem angegebenen Typ überein. ELF ELF\BinaryReader.cpp 12
    Fehler C2227 Links von "->read" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden. ELF elf\binaryreader.cpp 26
    Fehler C2061 Syntaxfehler: Bezeichner "ifstream" ELF elf\binaryreader.h 9
    Fehler C2143 Syntaxfehler: Es fehlt ";" vor "
    " ELF elf\binaryreader.h 5
    Fehler C2238 Unerwartete(s) Token vor ";" ELF elf\binaryreader.h 5



  • Fehlt in der BinaryReader.h nicht ein #include <fstream>?

    Anschließend noch das std:: vor dem ifstream

    std::ifstream* _reader;
    


  • Wie temi schrieb:
    - es fehlt dir das std:: vor dem ifstream im Header (2x)
    - in deiner cpp-Datei liest du in eine Variable "byte", die aber "value" heißt

    Dein Programm kompiliert auch ohne das #include <fstream> im Header. Das liegt allerdings daran, dass du in der cpp-Datei erst fstream includest, dann den Header BinaryReader.h. D.h. wenn du die Header-Reihenfolge änderst, wird das Include im Header notwendig. Daher ein genereller Ratschlag:

    Ratschlag: Das erste, was in einer .cpp-Datei stehen sollte, ist das #include des zugehörigen Headers!

    Damit ist u.a. sichergestellt, dass nicht versehentlich irgendwelche Header für die .h-Datei benötigt werden, die über die cpp-Datei included sind.

    Kommen wir zum nächsten Thema: Include nur, was nötig ist.
    Insbesondere include keine unnötigen C-Header wie <stdlib.h> .

    Und noch ein Punkt: Beachte die Rule of 3 (bzw. Rule of zero oder Rule of 5). Wenn du Speicherverwaltung selbst machst (d.h. ein "delete" im Destruktor hast), dann musst du auch den Copy-Constructor und Copy-Assignment behandeln. Wenn nämlich sonst jemand dein Objekt kopiert, hast du auf einmal doppeltes delete auf dieselbe Adresse. Daher überlässt man gerne die Speicherverwaltung solchen Klassen, die ausschließlich dafür geschaffen worden sind wie z.B. unique_ptr. Allerdings: warum musst du überhaupt ein ifstream* in deiner Klasse haben, tut es nicht ein ifstream (ohne 😉 auch?

    Da das alles zur Übung ist, hinterfrage ich den Nutzen dieser Klasse mal nicht 😉



  • Vielen Dank für die Antworten und die Ratschläge. Endlich klappt es 🙂

    Als Umgebung benutze VS 2015 und diese hat ifstream immer als Typ richtig erkannt. Daher dachte ich, es passt alles mit den includes.
    Mit "byte" und "value" hab ich im Browser umbenannt und wohl eine Stelle vergessen 😞

    Allerdings: warum musst du überhaupt ein ifstream* in deiner Klasse haben, tut es nicht ein ifstream (ohne 😉 auch?

    Du hast recht, ich werde es gleich ändern. Und das ifstream nur von außen übergeben werden kann.

    Da das alles zur Übung ist, hinterfrage ich den Nutzen dieser Klasse mal nicht 😉

    Ich habe ein Projekt in C# und will dies nun in C++ nachimplementieren und je nach Kapitel im Buch nehme ich dazu passenden Stellen im C# Projekt vor.



  • Quaneu schrieb:

    Ich habe ein Projekt in C# und will dies nun in C++ nachimplementieren und je nach Kapitel im Buch nehme ich dazu passenden Stellen im C# Projekt vor.

    O - M - F - G !! 🙄


Anmelden zum Antworten