Trannung von Header und Daten - Abstraktion



  • Hallo!

    Ich habe ein File, in dem die ersten 54 Bytes den Header darstellen, alle folgenden Bytes repräsentieren die Daten.

    1. Ich möchte jetzt eine Klasse CHeader und CDaten erstellen. Die Klasse CDaten soll abstrakt sein, damit man diese bei anderen Daten austauschen kann. Also z.B. eine abstrakte Klasse CDaten und davon abgeleitet CDatenFormat1. Muss die abstrakte Klasse dann auch ein Interface sein?

    2. In der CHeader Klasse lese ich das ganze File ein und speichere hier zuerst mal den Header in einer Member-Variable. Die restlichen Bilddaten möchte ich nun an die Klasse CDatenFormat1 übergeben, nur wie mache ich das damit ich nicht wieder speicher allokieren muss, die Daten aber in der CDatenFormat1 gespeichert werden? Die Daten von dem File in der Klasse nochmal auszulesen ist ja wohl nicht so gut!

    Danke!



  • reicht es nicht, zuerst den CHeader einzulesen, den zu interpretierenm und davon abhängig die CDatenFormatX anzulegen und einzulesen?



  • volkard schrieb:

    reicht es nicht, zuerst den CHeader einzulesen, den zu interpretierenm und davon abhängig die CDatenFormatX anzulegen und einzulesen?

    Ja genau so sollte es auch sein. Ich bin mir jetzt jedoch nur nicht sicher die ich die Daten an die CDatenFormatx übergeben soll.

    Prinzipiell sieht es bei mir so aus. Ich frage mich jetzt halt nur ob dieser temporäre Puffer bei mir wirklich notwendig ist? Ich will halt den Header in CFile, die Daten in CDatenFormat geteilt speichern, aber nur einma aus dem File auslesen und das im CFile.

    Verbesserungsvorschläge?

    class CFile   {
    private:
        header_struct header; //header-daten werden in einem struct verspeichert
        CDatenFormat data; //Klasse mittels starker Aggregation einbinden
    public:
        virtual void loadFile(string filename); //Laden eines Files      
    }
    
    CFile::loadFile (string filename) {
       ifstream file (filename.c_str(), ios::in|ios::binary|ios::ate);
    
       //Zuerst header laden
       file.seekg (0, ios::beg);
       file.read ((char*) &header, sizeof(header));
    
       //Jetzt Daten laden
       int length;
       file.seekg((-header.data_begin), ios::end);
       length = streamoff(file.tellg());
       file.seekg (header.data_begin, ios::beg);
    
       //Daten in temporären Puffer laden und an andere Klasse, die stark aggregiert wurde einbinden
       [b]char * datenbuffer;[/b]
       datenbuffer = new char [length];
       file.read (datenbuffer, length);
    
       file.close();
    
       //Buffer übergeben
       CDatenFormat data(datenbuffer, length);
    }
    
    class CDatenFormat   {
    private:
       data_struct format_daten;
    public:
       CDatenFormat (char* data, length) {
          //Speicher für member-variable format_data allokieren und data zuweisen
       }
    }
    

Anmelden zum Antworten