Probleme mit friend und einlesen von Binaerdateien

Guntpat1981

Mitglied
Hallo Zusammen,

ich habe zwei Probleme und wollte fragen, ob mir da eventuell jemand helfen kann.

Ich habe folgende Klassenstruktur:

class Team {
friend ostream & operator<<(ostream & output, Team & one_team);

public:
Team();
~Team();
//...weitere Funktionen
private:
char Name[25];
// 6 int-Variablen, die das Team näher beschreiben
};

1. Problem:
Ich möchte (wie oben angegeben) den ostream (also quasi "cout") überladen, um mit einem Befehl alle Angaben eines Objektes der Klasse Team ausgeben zu können. Ich habe, wie es üblich ist, die Operator-Funktion friend deklariert, um in Ihrer Implementierung direkten Zugriff auf die privaten Elemente der Klasse Team zu haben. Leider funktioniert dies trotz meiner Implementierung nicht. Kann mir jemand sagen, woran das liegen kann?

2. Problem:
Ich möchte von einer vorhandenen Binaerdatei Daten in meine Variablen von Objekten der Klasse Team einlesen. Ich habe einen Vector, der mehrere Objekte der Klasse Team verwaltet - ich habe mir gedacht, die gesamte Klassenstruktur folgendermaßen einzulesen:

ifstream inFile("filename.dat", ios::binary);
//...
Team mannschaft; //anlegen eines Objektes der Klasse
inFile.read(reinterpret_cast<char*>(&mannschaft), sizeof(Team));
//...
Wenn ich diesen Befehl verwende, verschiebt sich meine ganze Strukur jeweils um 4 Bytes - ich glaube, dass das etwas mit dem Attribut Name zu tun hat, welches char-array ist. Ich muss allerdings dieses char-array laut Aufgabenstellung als string - objekt verwenden.

Vielleicht weiß ja jemand von Euch Rat, wäre sehr dankbar.
 
Hallo,
um in Ihrer Implementierung direkten Zugriff auf die privaten Elemente der Klasse Team zu haben. Leider funktioniert dies trotz meiner Implementierung nicht. Kann mir jemand sagen, woran das liegen kann?
Du brauchst trotz friend immer noch ein Objekt mit welchen du dann auf die
privaten Elemente zugreifen kannst
versuch mal folgendes:

Code:
#include <iostream>
#include <fstream>

using namespace std;

class Team{

        private:
                char* name;
                int players;

        public: 
                Team(char* n = "", int p = 0){
                        name = n;
                        players = p;
                }

                void reset(){
                        name = "";
                        players = 0;
                }

                friend ostream& operator<<(ostream& cout, Team& team){

                        cout << "name of team: " << team.name  << endl;
                        cout << "number of players: " << team.players;
                        return cout;
                }

                friend ofstream& operator<<(ofstream& out,  Team& team){
                     
                        out.write(reinterpret_cast<char*>(&team), sizeof(Team));
                        return out;
                }

                friend ifstream& operator>>(ifstream& in, Team& team){
                     
                        in.read(reinterpret_cast<char*>(&team), sizeof(Team));
                        return in;
                }
};
                     
int main(){

        Team t("Boston Celtics", 10);
        ofstream out("filename.dat", ios::binary);
        cout << t << endl;
        out << t;
        out.close();
        t.reset();
        cout << t << endl;
        ifstream in("filename.dat", ios::binary);
        in >> t;
        cout << t << endl;
}

Wie die Serialisierung mit string objekten funktioniert kann ich dir leider
nicht sagen...

Gruß

RedWing
 
Hallo,
was mir grad noch eingefallen ist, zwecks der Serialisierung deines String Objektes:
Du könntest dir in deiner Klasse eine Struktur definieren, die alle Daten der Klasse
enthält, aber jedesmal wenn deine Klassenmember ein String ist, ist das
dazugehörige Datum deiner Struktur ein char* und jedesmal wenn du
serialisieren/deseialisieren möchtest aus dieser lesen bzw in diese schreiben.
Der Nachteil wäre halt das du die Struktur immer uptodate mit deiner Klasse
halten musst...

Ungefähr so:

Code:
using namespace std;

class Team{

        private:
                string name;         
                int players;                                                                                                        

                struct PseudoTeam{                                                                                                  
        
                        char* name;          
                        int players; 
                };

                PseudoTeam dummy;                                                                                                   

        public:
                Team(char* n = "", int p = 0){
                        dummy.name = n;      
                        dummy.players = p;   
                        name = n;            
                        players = p; 
                }

                void reset(){                
                        name = "";           
                        players = 0; 
                }

                friend ostream& operator<<(ostream& cout, Team& team){                                                              

                        cout << "name of team: " << team.name  << endl;
                        cout << "number of players: " << team.players;                                                              
                        return cout; 
                }

                friend ofstream& operator<<(ofstream& out,  Team& team){                                                            
                                             
                        out.write(reinterpret_cast<char*>(&team.dummy), sizeof(PseudoTeam));                                        
                        return out;  
                }

                friend ifstream& operator>>(ifstream& in, Team& team){                                                              
                                             
                        in.read(reinterpret_cast<char*>(&team.dummy), sizeof(PseudoTeam));                                          
                        team.name = team.dummy.name;
                        team.players = team.dummy.players;                                                                          
                        return in;   
                }
};
                     
int main(){

        Team t("Boston Celtics", 10); 
        ofstream out("filename.dat", ios::binary);                                                                                  
        cout << t << endl;   
        out << t;
        out.close();
        t.reset();
        cout << t << endl;   
        ifstream in("filename.dat", ios::binary);                                                                                   
        in >> t;
        cout << t << endl;                                                                                                          
}

Gruß

RedWing
 
Zuletzt bearbeitet:
Zurück