3 Stimmen

Übergabe einer abstrakten Klasse an ein E/A-Makro

Ich habe die Serialisierung implementiert, indem ich dafür gesorgt habe, dass Klassen in einer Vererbungshierarchie virtuelle Lese- und Schreibfunktionen implementieren:

class base
{
     ...

     virtual void read(std::istream&)=0;
     virtual void write(std::ostream&) const=0;
     virtual std::string is_a() const;
};

BEGIN_NAMESPACE_1(io)
    SERIALISE(base)
END_NAMESPACE_1

wobei das Makro "SERIALISE" eine Überladung einer "serialise"- und einer "deserialise"-Funktion implementiert, um eine einfache E/A über den Zeiger der Basisklasse zu ermöglichen:

#define SERIALISE(TYPE)\
void deserialise( boost::shared_ptr<TYPE>& dat, std::istream& ifs )\
{\
    std::string type;\
    read(type, ifs);\
\
    dat = TYPE::make_##TYPE(type);\
    dat->read(ifs);\
}\
\
void serialise( const boost::shared_ptr<TYPE>& dat, std::ofstream& ofs )\
{\
    write(dat->is_a(), ofs);\
    dat->write(ofs);\
}

Allerdings, wenn die Basisklasse reine virtuelle Funktionen enthält, erhalte ich einen Compiler-Fehler "kann nicht Objekt des abstrakten Typs "Basis" zuweisen, weil die folgenden Funktionen innerhalb von "Basis" rein sind...", vermutlich weil der Compiler versucht, die abstrakte Basisklasse zu instanziieren, wenn der Klassenname an den Makroaufruf übergeben wird. Gibt es eine Möglichkeit, dieses i/o-Design zu retten?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X