AlexanderKiebler
Grünschnabel
Hi
Mich würde interessieren, ob man generell virtuelle Methoden überladen kann.
Vroweg, mir gelingt es nicht,
Ich würde gene eine Klasse zum arbeiten mit PGM Formaten schreiben.
Dabei hat das PGM Format mehrere Versionen (Binaer, ASCII, RGB und Graustufen)
Die Klasse soll sich für den Benutzer versionsunabhängig verhalten. Hierzu wollte ich eine Schnittstelle definieren (Virtuelle klasse) und sämtliche Versionen davon ableiten.
Jetzt ist es so, daß die Übergabaparameter für die Funktionen, welche auf die Daten der Klassen zugreifen davon abhängig sind, ob sie RGB oder Gray sind. In Folge dessen müßte ich die virtuellen Methoden der Vaterklasse überladen.
Ich habe im unteren Beispiel die Überladene Funktion rot markiert.
Mich würde interessieren, ob man generell virtuelle Methoden überladen kann.
Vroweg, mir gelingt es nicht,
Ich würde gene eine Klasse zum arbeiten mit PGM Formaten schreiben.
Dabei hat das PGM Format mehrere Versionen (Binaer, ASCII, RGB und Graustufen)
Die Klasse soll sich für den Benutzer versionsunabhängig verhalten. Hierzu wollte ich eine Schnittstelle definieren (Virtuelle klasse) und sämtliche Versionen davon ableiten.
Jetzt ist es so, daß die Übergabaparameter für die Funktionen, welche auf die Daten der Klassen zugreifen davon abhängig sind, ob sie RGB oder Gray sind. In Folge dessen müßte ich die virtuellen Methoden der Vaterklasse überladen.
Ich habe im unteren Beispiel die Überladene Funktion rot markiert.
Code:
template<class kind_pgm> class pgm
{
private:
//Jedes pgm Objekt ist mit dinem Dateinamen verkuepft, aus welchem gelesen, oder in
//welchen geschrieben wird
std::string dateiname; //Der name der Datei
//Die von Sun Microsystems spezifizierten Daten fuer den header des PGM Formates
int size_x; //Größe in x-Richtung (Bildbreite)
int size_y; //Größe in y-Richtung (Bildhöhe)
std::string formatken; //Speicher für die Formatkennung
int dynamic_range; //Maximale Aussteuerung
public:
//Konstruktor initialisiert den Dateikopf
pgm(std::string dat_nam,int size_x,int size_y,std::string formken); //Konstruktor
//Der Destruktor der Basisklasse muß hier virtuell sein, damit destruktoren von abgeleiteten
//klassen aufgerufen werden.
virtual ~pgm()=0; //Destruktor
std::string get_dat_nam(void); //Gibt dateiname zurück
int get_size_x(void); //gibt size_x zurück
int get_size_y(void); //gibt size_y zurück
std::string get_format(void); //gibt die Formatkennung zurück
//Datei öffnen
//Spätes Binden der Methoden --virtual
//virtual bool write_to_hdd()=0; //Schreibt die Daten auf die Harddisk
//virtual bool reade_from _hdd()=0; //Holt die Daten von der Festplatte
virtual void read_head(void) throw(pgm_err)=0; //Kopf lesen
//Datenmanipulationen
virtual void set_akt_pix(int Breite,int Hoehe) throw(pgm_err)=0; //Setzt aktuelle Pixel Postition
virtual void next_akt_pix(void) throw(pgm_err)=0; //Nächstes Listenelement
virtual kind_pgm get_pix(void)=0; //Gibt das aktuelle Pixel zurück
// virtual void write_pix(kind_pgm iss)=0; //Schreibt ein aktuelles Pixel
virtual void write_pix()=0;
virtual void append_pix(kind_pgm iss) throw(pgm_err)=0; //Hängt ein Pixel an die Liste an
//virtual std::ostream& operator << (pgm<kind_pgm>)=0; //Ausgabe stream Operato
};
template<class kind_pgm> class pgm_p2 : public pgm<kind_pgm>
{
private:
pgm_grau<kind_pgm> *data; //Die graustufendaten
pgm_grau<kind_pgm> *pos_ptr; //Pointer auf aktuelles Element der Liste
void rek_clear_list(pgm_grau<kind_pgm> *dat); //Rekursives löschen einer Liste
public:
pgm_p2(std::string dat_nam,int size_x,int size_y,std::string formken,kind_pgm iss); //Konstruktor
~pgm_p2(); //Destruktor
//Datei öffnen
virtual void read_head(void) throw(pgm_err); //Liest den Header
//Datenmaipulation
virtual void next_akt_pix(void) throw(pgm_err); //Nächstes Listenelement als aktuelles Pixel
virtual void set_akt_pix(int Breite, int Hoehe) throw(pgm_err); //Setze aktuelle Pixelposition
virtual kind_pgm get_pix(void); //Gibt pixel zurück auf welches pos_ptr zeigt
virtual void write_pix(kind_pgm iss); //Schreibt Pixel, auf welches pos_ptr zeigt
virtual void write_pix();
virtual void append_pix(kind_pgm iss) throw(pgm_err); //Hängt ein Pixel an die Liste an
//virtual std::ostream& operator<<(pgm_p2<kind_pgm> &s); //Ausgabe streamen
};
Zuletzt bearbeitet: