Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Serialisierung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
19.08.2005, 16:47 Uhr
~Patrick
Gast


Aber woran liegts dann? Speziell auch darum, weil sich der Compiler über den fehlenden Copy - konstruktor beschwert, sobald ich die Serialisierungsstatements einfüge! Vorher ist das alles unproblematisch und läuft einwandfrei...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
19.08.2005, 17:05 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


die meckernde stelle ist die:


C++:
  _Ty _Tmp = _Val;    // in case _Val is in sequence


(vector, Zeile 810)

der ruft da einen "Zuweisungskonstruktor" bzw "Kopierkonstruktor" auf, keinen "Zuweisungsoperator"! da du da keinen hast kann er das natürlich nicht.

füg deiner klasse ein


C++:
   ClInschrift(const ClInschrift &source) {this->text = source->text; this->nummer = source->nummer;}



hinzu, dann sollte es gehen.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
19.08.2005, 17:46 Uhr
~Patrick
Gast


Hab den Copy - konstruktor hinzugefügt. Header - File sieht jetzt so aus:

C++:
class ClInschrift : public CObject
    {
    public:
    ClInschrift()
        {this->text = "";
        this->nummer = "";}
    ClInschrift(string text, string nummer)
        {this->text = text;
        this->nummer = nummer;
        }
    ~ClInschrift() {return;}    //Destruktor
    
    
    ClInschrift & operator = (ClInschrift & zugewiesenesObjekt)    //Copy - Konstruktor
        {
        //if (this ==  &zugewiesenesObjekt) return * this;
        this->nummer = zugewiesenesObjekt.nummer;
        this->text = zugewiesenesObjekt.text;
        return * this;
        }
    
     ClInschrift(const ClInschrift &source)
        {this->text = source.text;
        this->nummer = source.nummer;}
        
    
    string displayText() {return text;}
    string displayNummer() {return nummer;}
    
    private:
    string text;
    string nummer;
    };


Jetzt kommt die Meldung:

Zitat:

cProgramme\Microsoft Visual Studio .NET 2003\Vc7\include\xutility(1136): error C2679: Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operator vom Typ 'const ClInschrift' akzeptiert (oder keine geeignete Konvertierung möglich)


Bezieht sich auf die Definition des Zuweisungsoperators.
Die Meldung verweist auf die Zeile:

C++:
template<class _FwdIt,
    class _Ty> inline
    void fill(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)
    {    // copy _Val through [_First, _Last)
    for (; _First != _Last; ++_First)
        *_First = _Val;


in der xutility - Bibliothek. Hab bezüglich des Zuweisungsoperators auch schon diverse Varianten versucht, bsw. Übergabe von Pointern statt Referenzen, hat aber alles nicht funktioniert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
19.08.2005, 18:08 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


dein operator muss auch so aussehen:


C++:
ClInschrift & operator = (const ClInschrift &source)
{
  this->nummer = source.nummer;
  this->text = source.text;
  return (*this);
}



also das zuzuweisende objekt ist const!
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
22.08.2005, 13:03 Uhr
~Patrick
Gast


Funktioniert! Danke schon mal hierfür. Zwar motzt der Compiler jetzt nicht mehr über fehlende Konstruktoren, dafür macht er mir das Serialisieren an sich recht schwierig, mit der Standard - Funktion komm ich leider nicht weit.
Meine aktuelle Serialize() - Funktion meiner Klasse ClInschrift sieht wie folgt aus:

C++:
void ClInschrift::Serialize(CArchive &ar)
{
     CObject::Serialize(ar);
    
     CString nummerTemp, textTemp;
     nummerTemp = text.c_str();
     textTemp = text.c_str();
    
     if (ar.IsStoring())
         ar << nummerTemp << textTemp;
     else
        ar >> nummerTemp >> textTemp;  
    
}


Die Umwandlung in CStrings nehme ich vor, weil die Ein - und Ausgabeoperatoren scheinbar nicht für String überladen sind. Das eigentliche Problem tritt aber erst dann auf, wenn ich die Funktion aufrufen will.
Zu diesem Zweck habe ich einen Button hinzugefügt, der zunächst ein Objekt vom Typ ClInschrift erzeugt, und dieses dann speichern soll.

C++:
ClInschrift test("Text1","text2");
test.Serialize(ar);


Bisher dachte ich, dass ich mir um die CArchive Objekte wenig bis keine Gedanken machen muss, weil diese durch die Makros und das Anwendungsgerüst hinzugefügt werden. Da habe ich mich aber scheinbar geirrt. Der Conmpiler motzt:

Zitat:

...Inschrift\InschriftDlg.cpp(728): error C2065: 'ar': nichtdeklarierter Bezeichner


Header usw. sind richtig eingebunden, daran wirds also wahrscheinlich nicht liegen. Allerdings gehen mir leider wieder die Erklärungen aus.
Hier nochmal die Klassendeklaration mit laufender Zuweisung (danke an FloSoft):

C++:
class ClInschrift : public CObject
    {
    
    DECLARE_SERIAL(ClInschrift)
    
    public:
    ClInschrift()
        {this->text = "";
        this->nummer = "";}
    ClInschrift(string text, string nummer)
        {this->text = text;
        this->nummer = nummer;
        }
    ~ClInschrift() {return;}    //Destruktor
    
    virtual void Serialize(CArchive &ar);
    
    ClInschrift & operator = (const ClInschrift &source)
        {
        if (this == &source) return *this;
        this->nummer = source.nummer;
        this->text = source.text;
        return (*this);
        }

     ClInschrift(const ClInschrift &source)
        {this->text = source.text;
        this->nummer = source.nummer;}
        
    string displayText() {return text;}
    string displayNummer() {return nummer;}
    
    private:
    string text;
    string nummer;
    };


Jemand nen Vorschlag, warum meine Objekte nicht gespeichert werden wollen?
Patrick
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
22.08.2005, 22:51 Uhr
mmc20
puss in boots


hi, zeig doch mal bitte den code mit dem du das CArchive "ar" definierst, sonst tappen wir hier im dunkeln...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
23.08.2005, 15:01 Uhr
~Patrick
Gast


Ich hab bisher auf die Standardformulierungen zur Serialisierung zurückgegriffen, die ich in einer Reihe von Lehrbüchern fand. Ich definiere bisher keine Variable CArchive ar, war aber der Meinung, dies würde vom Framework erzeugt. In verschiedenen Texten stand, dass dieses ein CFile Objekt anlegt, wenn auf eine Datei zugegriffen wird und anschließend ein CArchive - Objekt, welches auf dieses zeigt. Dementsprechend war ich der Meinung, man müsste da weiter nichts festlegen, hab mich dabei aber wohl geirrt. Auf der Microsoft - Seite
http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/vccore/html/_core_two_ways_to_create_a_carchive_object.asp

steht, dass CArchive - Objekte entweder automatisch oder explizit deklariert werden können. Ich würde natürlich gerne auf die automatische Methode zurückgreifen, weiß aber nicht, warum mein Programm da keine Lust zu hat!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
23.08.2005, 15:59 Uhr
~Patrick
Gast


Problem gelöst!
Baue die Objekte jetzt manuell auf. Funktioniert einwandfrei.
Danke für eure Hilfe!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: