2010-08-02 22 views
5

ich möchte eine Klasse mit einem Attribut als eine Liste von Zeigern auf einer generischen Klasse serialisiertC++ Boost-Serialisierung Serialisierung Templat abgeleiteten Klassen

Dies ist die übergeordnete Klasse, aus der die generische Klasse abgeleitet:

class Base{ 

    public : 

     friend class boost::serialization::access; 

     virtual ~Base(){} 

     template<class Archive> 
     void serialize(Archive & ar, const unsigned int version) 
     { 
     } 

     virtual string Getid() = 0 ; 

}; 

Die generische Klasse:

template<typename T> 
class GenericBase : public Base 
{ 
    public: 

     friend class boost::serialization::access; 

     GenericBase<T>(string id){} 
     ~GenericBase(){} 

     string id; 

     vector<T> data 

     template<class Archive> 
     void serialize(Archive & ar, const unsigned int version) 
     { 
      ar & boost::serialization::base_object<Base>(*this); 
      ar & BOOST_SERIALIZATION_NVP(id); 
      ar & BOOST_SERIALIZATION_NVP(data); 

     } 

     string Getid() { return id; } 

}; 

Die Klasse i

class Use 
{ 
    public: 

     friend class boost::serialization::access; 

     int Id; 

     map<string, Base*> BaseDatas; 

     Use(); 
     ~Use(); 

}; 

So serialisieren möchten, nachdem die Boost-Serialisierung doc Lesen (http://www.boost.org/doc/libs/1_43_0/libs/serialization/doc/serialization.html#derivedpointers), habe ich versucht, dies in der Serialisierungscode:

main(){ 

    Use u = Use(); 

    std::ofstream ofs(filename, ios::binary); 

    // save data to archive 

    boost::archive::binary_oarchive oa(ofs); 

    oa.template register_type<GenericBase<Type1> >(); 
    oa.template register_type<GenericBase<Type2> >(); 
    oa.template register_type<GenericBase<Type3> >(); 

    oa<<u; 

} 

ich eine Nachricht bekam,

error: 'template' (as a disambiguator) is only allowed within templates

, so ersetzte ich

oa.template register_type >();

von

oa.register_type();

es funktionierte, und ich in der Lage gewesen in Text und binär zu speichern (i die Daten geprüft)

zum Laden jetzt, habe ich nur diese Zeilen:

main(){ 

    Use u; 

    std::ifstream ifs(filename, ios::binary); 

    // load data 

    ia.register_type<GenericBase<Type1> >(); 

    boost::archive::binary_iarchive ia(ifs); 

    ia>>u; 

} 

warf mir einen Fehler:

error: no matching function for call to 'GenericBase::GenericBase()'

jemand sagte mir, ich habe zwei Methoden außer Kraft zu setzen, wie in diesem Beispiel speichern und laden http://www.boost.org/doc/libs/1_43_0/libs/serialization/doc/serialization.html#constructors

namespace boost { namespace serialization { 
template<class Archive> 
inline void save_construct_data(
    Archive & ar, const my_class * t, const unsigned int file_version) 
    { 
     // save data required to construct instance 
     ar << t->m_attribute; 
    } 

template<class Archive> 
inline void load_construct_data(
    Archive & ar, my_class * t, const unsigned int file_version) 
    { 
     // retrieve data from archive required to construct new instance 
     int attribute; 
     ar >> attribute; 
     // invoke inplace constructor to initialize instance of my_class 
     ::new(t)my_class(attribute); 
    } 
}} // namespace ... 

aber wo habe ich sie definieren? In Deklaration der Benutzungsklasse? Und wie gehe ich mit dem Mitglied um?

map<string, Base*> BaseDatas; 

?

Dank für Ihre Hilfe;)

+0

Sollte nicht 'class Use' von' Base' oder 'GenericBase' abgeleitet sein? – Inverse

+0

Nein, Klasse Use verwendet Basis als Attribut – user408535

+0

Die von Ihnen angegebene Verwendungsklasse enthält keine Serialisierungsfunktion. –

Antwort

0

but where do I have to define them ?

Sie sie in Ihren Header

And how do I deal with the member...

definieren kann ich glaube, Sie Boost-Zeiger verfolgen BOOST_CLASS_TRACKING mit bekommen ...

http://www.boost.org/doc/libs/1_42_0/libs/serialization/doc/special.html#objecttracking

+0

"Sie können sie in jedem Ihrer Header definieren" aber in welcher Klasse haeder? Verwenden, Basis, GenericBase? „Ich glaube, Sie Schub bekommen können Zeiger mit BOOST_CLASS_TRACKING ... verfolgen“ , was ist der Sinn? Das Problem ist nicht ein einzelner Zeiger, sondern eine Zeigerkarte; Wie gehe ich mit dieser Karte von Zeigern in der Methode load_construct_data um? – user408535

+0

Ich habe meins in eine separate Kopfzeile namens "serialisation.hpp" ... das könnte ein guter Ort sein, dann in den anderen Klassenheadern aufnehmen? Die Karte kann mit der eingebauten Serialisierung einiger STL-Container behandelt werden: #include "boost/serialization/map.hpp" – user274244

4

Es ist einfacher zu kommentieren, wenn Sie pro ein funktionsfähiges (ausschneiden-und-einfügen-) Beispiel Ihres fehlerhaften Codes mit einigen Dummy-Daten ...

Aber ich versuche trotzdem zu antworten ...

Boost.serialisation versucht GenericBases Standardkonstruktor aufzurufen, schlägt aber fehl, da Sie es nicht bereitstellen. Boost.serialisation erstellt zuerst Ihr Objekt (oder versucht es jetzt), DANN liest die Datei und setzt die Variablen.

Sie könnten versuchen, einen geschützten Standardkonstruktor zu deklarieren, auf den der Zugriff durch Zugriff zugreifen soll.

+0

speicherte meine Gesundheit, fügte einen Standard geschützten ctor hinzu und alles, was funktionieren sollte, begann zu arbeiten. .. – mentat

Verwandte Themen