Save und Load über DocClass mit Private-Variablen



  • Hallo ich bin gerade ein Projekt fürs Studium am entwerfen und bin sogut wie fertig.

    Habe anders als in der Übung besprochen meine Variablen in der Hilfsvariable Private gemacht und würde das gern auch so belassen. Warum, weis ich nicht genau weil man es so macht, zumindest wenn ich die Fach Literatur richtig verstanden habe 😉

    Mein Problem ist nun das wir eine Code gezeigt bekommen haben mit dem wir public Variablen mit hilfe der Doc Klasse Speichern und Laden können.

    Das sieht in etwas so aus:

    void CSE10Doc::Serialize(CArchive& ar)
    {
    	if (ar.IsStoring())
    	{
    		// TODO: add storing code here
    		ar << i;
    		ar << Beschreibung;
    
    		for(int i = 1; i <= daten.geti(); i++)
    		{
    			ar << X1(i);
    			ar << Y1(i);
    			ar << X2(i);
    			ar << Y2(i);
    		}
    	}
    	else
    	{
    		// TODO: add loading code here
    		ar >> i;
                    ar >> Beschreibung;
    
    		for(int i = 1; i <= daten.geti(); i++)
    		{
                           	ar >> X1(i);
    			ar >> Y1(i);
    			ar >> X2(i);
    			ar >> Y2(i);
    		}
    	}
    }
    

    Das Klappt so Logischerweise nicht mit meinen privaten Variablen

    Ic habe für meine Variablen iX1[101] Methoden geschrieben mit denen diese Variablen beschrieben werden können.

    Beispielsweise für die Variable Beschreibung (bei mir sBeschreibung):

    void editBeschreibung(CString str){sBeschreibung=str;}; // direkt in der Klasse definiert
    

    Mein Frage ist nun: Weis jmd. ne möglichst unkomplizierte verständliche Lösung für mich?
    Möchte es gerne Korrekt machen, sprich mit privaten variablen. Könnt jetzt natürlich auch alles umschreiben aber die Lösung wäre "traurig", finde ich. 🙂

    Ich hoffe ich konnte mein Problem verständlich erläutern und freu mich über jeden versuch der Hilfe 🙂



  • So ganz habe ich es nicht verstanden was du machen willst.
    Auf jeden Fall wenn du mehrere Variablen hast die gleiche Bedeutung haben so könntest du sie im Array halten. Damit brauchst du nur eine Zugrifffunktion um alle Elemente des Array abzufragen, wie:

    GetX(int idx)

    Was du ach machen könntest ist deine Klasse wo du die privaten Veriablen hast ein Funktion schreiben die das CArchiv übergibt und dort die Varibalen in ar speichern.



  • Hallo Michael,

    Erstmal Vielen Dank für deine Antwort.
    Arrays hab ich so oder so benutzt das Problem lag ehr darin das ich zwar wusste wie ich die Daten abspeichern konnte aber nicht wie ich sie wieder lade.

    denn

    ar << daten.getIrgendwas(k); //OK
    
    ar >> daten.getIrgendwas(k); //Fehler
    
    //oder 
    
    ar >> daten.setIrgendwas(k); //Fehler
    
    //oder
    
    daten.setIrgendwas(ar); //Fehler
    
    //usw.
    

    Geht natürlich nicht. Leider sind wir im Studium von den Basics direkt auf MFC Programmierung gesprungen so, dass ich den Hintergrund dieser Speicher Funktion nicht versteheund das ist bei weitem nicht das einzige bei dem ich mich "das ist nunmal so" begnügen muss.

    Mit Public Variablen wäre das ganz einfach gewesen, nicht das meine Lösung schwieriger wäre, weil ich diese ja direkt hätte zuweisen können.

    Heute morgen gegen halb 4 also ich VS zugemacht habe und gerade ins Bett gehen wollte habe ich die Rettende Lösung gehabt, dass ich darauf nicht früher gekommen bin.

    Für diejenigen die es interessiert:

    Es handelt sich um ein Programm das Per Hand eingegebene Parameter (2 X/Y Koordinaten, Farbe, Strichstärke, Symbol und Beschreibung einließt)

    Damit können dann über OnDraw 100 Rechtecke, Linien oder Ellipsen "gezeichnet" werden.

    Hier meine Save/Load Lösung:

    void CSE10Doc::Serialize(CArchive& ar)
    {
    	int i;
    	int geti=daten.geti();
    	int x1[101],x2[101],y1[101],y2[101];
    	CString farbe[101],size[101],symbol[101];
    	CString getBeschreibung = daten.getBeschreibung();
    
    	for(i=1;i<=daten.geti();i++)
    	{
    		x1[i]=daten.getX1(i);
    		y1[i]=daten.getY1(i);
    		x2[i]=daten.getX2(i);
    		y2[i]=daten.getY2(i);
    		farbe[i]=daten.getColor(i);
    		size[i]=daten.getSize(i);
    		symbol[i]=daten.getSymbol(i);
    	}
    
    	if (ar.IsStoring())
    	{
    		// TODO: add storing code here
    
    		ar << geti;
    		ar << getBeschreibung;
    
    		for(i=1;i<=daten.geti();i++)
    		{
    			ar << x1[i];
    			ar << y1[i];
    			ar << x2[i];
    			ar << y2[i];
    			ar << farbe[i];
    			ar << size[i];
    			ar << symbol[i];
    		}
    
    	}
    	else
    	{
    		ar >> geti;
    		ar >>getBeschreibung;
    
    		for(i=1;i<=geti;i++)
    		{
    			ar >> x1[i];
    			ar >> y1[i];
    			ar >> x2[i];
    			ar >> y2[i];
    			ar >> farbe[i];
    			ar >> size[i];
    			ar >> symbol[i];
    		}
    	}
    
    	daten.seti(geti);
    	daten.editBeschreibung(getBeschreibung);
    
    	for(i=1;i<=daten.geti();i++)
    	{
    		daten.editParameter(size[i],symbol[i],farbe[i],i,x1[i],y1[i],x2[i],y2[i]);
    	}
    }
    

Anmelden zum Antworten