MFC & STL
-
Ein STL-Container ist, als Variable gesehen, auch nicht anders als ein Array oder ein beliebiges anderes Objekt, oder auch integer.
Wie "verwaltest" du solche anderen Variablen ??mfg JJ
-
Also, in meiner Serialize steht folgendes:
void CSDIFrameDoc::Serialize(CArchive& ar) { ... ... vector< vector< vector< vector<double> > > > animData(timeSteps); ... ... }
Also ist mein animData[][][][] lokal in der Serialize() bekannt - nicht aber im ganzen Dokument.
Ich habe die Definition (eigentlich ist ja eine Initialisierung) mal in den Header gesetzt - erwartungsgemäß klappt das nicht. Gibt es eine Möglichkeit, das STL-Objekt im Header zu definieren?
-
Bist du sicher das du sowas brauchst ????
[cpp]vector< vector< vector< vector<double> > > > animData(timeSteps); [/cpp]Was ist mit dem Vorschlag von SirLant, sieht doch gut aus. Das heisst, Variable nicht lokal in der Funktion Serialize(), sondern im Objekt CSDIFrameDoc.
mfg JJ
-
Habe ich versucht:
class CSDIFrameDoc : public CDocument { protected: // Nur aus Serialisierung erzeugen CSDIFrameDoc(); DECLARE_DYNCREATE(CSDIFrameDoc) // Attribute public: int timeSteps; vector< vector< vector< vector<double> > > > animData(timeSteps); ... }
Läuft leider nicht:
sdiframedoc.h(25) : error C2143: Syntaxfehler : Fehlendes ';' vor '<'
sdiframedoc.h(25) : error C2501: 'vector' : Fehlende Speicherklasse oder Typbezeichner
sdiframedoc.h(25) : error C2059: Syntaxfehler : '<'
sdiframedoc.h(25) : error C2238: Unerwartete(s) Token vor ';'P.S. Sorry mit dem Doppelpost... Ist wohl schlechter Stil, wie?
-
Und im Konstruktor läuft es auch nicht
CSDIFrameDoc::CSDIFrameDoc() { // ZU ERLEDIGEN: Hier Code für One-Time-Konstruktion einfügen int timeSteps; vector< vector< vector< vector<double> > > > animData(timeSteps); }
Müßte dann doch ein Member der Klasse sein. Kommt aber:
SDIFrameDoc.cpp(38) : error C2065: 'vector' : nichtdeklarierter Bezeichner
SDIFrameDoc.cpp(38) : warning C4804: '<' : unsichere Verwendung des Typs 'bool' in einer Operation
SDIFrameDoc.cpp(38) : warning C4804: '<' : unsichere Verwendung des Typs 'bool' in einer Operation
SDIFrameDoc.cpp(38) : error C2062: 'double'-Typ unerwartet
SDIFrameDoc.cpp(125) : error C2065: 'timeSteps' : nichtdeklarierter Bezeichner
SDIFrameDoc.cpp(134) : error C2872: 'vector' : Mehrdeutiges Symbol
SDIFrameDoc.cpp(134) : error C2872: 'vector' : Mehrdeutiges Symbol
-
Natürlich geht das nicht...
Variablen werden nun mal im Konstruktor konstruiert,
und nicht vorher schon. Du müsstest also die Klammern weglassen.Devil
-
Den notwendigen header <vector> hast du hoffentlich includiert.
Und wenn du nicht "using namespace std" verwendest schreibst du
natürlich std::vector.Das sind aber Sachen die nicht in erster Linie was mit STL sondern mit C++ zu tun haben.
mfg JJ
-
Also:
CSDIFrameDoc::CSDIFrameDoc() { // ZU ERLEDIGEN: Hier Code für One-Time-Konstruktion einfügen using namespace std; vector< vector< vector< vector<double> > > > animData(timeSteps); }
Okay, das läuft.
void CSDIFrameDoc::Serialize(CArchive& ar) { using namespace std; ... animData[i].resize(elements); ... }
Das läuft nicht. animData ist jetzt ein nichtdeklarierter Bezeichner.
Gab's da nicht was mit this-> ...?
-
Du arbeitest also mit der MFC, welche ja praktisch nur auf Objekten besteht und hast keine Ahnung von OOP in C++
Du _initialisierst_ die Membervariablen deiner _Klasse_ im _Konstruktor_
so:
foo { public: //Konstruktor foo () { //Initialisieren i = 12; } private: //Membervariable von foo int i; }
-
... aus Objekten ...
Hast ja recht - ich habe mal eine C-Vorlesung gehört und ein MFC-Tutorial gelesen. Dafür klappt's aber ganz gut.
"Keine Ahnung" finde ich etwas übertrieben - sagen wir, (un)gesundes Halbwissen. Sitze erst seit ca. 3 Wochen vor der OOP mit der MFC - da werden doch Wissenslücken erlaubt sein, oder?
Werde mit den erhaltenen Tips mal ein paar Bücher konsultieren - wir reden irgendwie auf verschiedenen Ebenen... Aber danke schonmal.
-
Also wenn ich deine Fragen/Antworten so sehe kann ich nicht glauben das es gut
läuft
Das muss daran liegen das du bisher deine von Wizards generierten Programme
mit nur marginalen Änderungen unverändert übernommen hastDas du weisst was in dem generierten Code wirklich abgeht bezweifle ich stark. So schön sich das anlässt, fällt das ganze (offentsichtlich) schon bei Trivialitäten auseinander
mfg JJ
-
Evtl. wär mal n tut angebracht, damit du mal die Grundstrukturen von C++ verstehst:
http://schornboeck.net/ckurs/inhalt.htm
-
einen wunderschönen...
wenn ich mich mal einklinken darf... Ich habe gerade dasselbe Problem mit einem Vektor, den ich öffentlich deklariere. Ich bekomme leider auch die Fehlermeldung 'nicht deklarierter Bez.'.Ich hab in beiden Dateien <vector> inkludiert.
c_IdentityDlg.h
class c_IdentityDlg : public CDialog { ... public: std::vector <CString> vect; ... };
c_IdentityDlg.cpp
... for(int i=0;i<vect.size();i++) { lvItem.iItem = i; lvItem.pszText = vect[i].GetBuffer(vect[i].GetLength()); pLC->InsertItem(&lvItem); }
ich mach da wohl auch was falsch ?!
-
SirLant schrieb:
Du arbeitest also mit der MFC, welche ja praktisch nur auf Objekten besteht und hast keine Ahnung von OOP in C++
Wenn ich hier nicht im MFC-Forum wäre dann würde ich das kommentieren, aber so lasse ich es lieber...
Du _initialisierst_ die Membervariablen deiner _Klasse_ im _Konstruktor_
so:
foo { public: //Konstruktor foo () { //Initialisieren i = 12; } private: //Membervariable von foo int i; }
Eigentlich wäre es ja in der Initialisierungsliste wesentlich besser:
class bar { public: bar() :i(12) {} private: int i; };
-
nman schrieb:
Eigentlich wäre es ja in der Initialisierungsliste wesentlich besser:
class bar { public: bar() :i(12) {} private: int i; };
Wenn ich hier nicht im MFC-Forum wäre dann würde ich das kommentieren, aber so lasse ich es lieber...
:p
Erwarte von den MFC'lern net, das sie C++ können
-
Sorry, mein Beitrag war wohl überflüssig. Hatte tatsächlich einen falschen Bezeichner, einen Buchstaben zu viel. (ist schon spät... geh jetzt lieber pennen bevor ich noch mehr Code verhunze und unnötige Beiträge schreibe )
Gude nacht allerseits!
-
nman schrieb:
SirLant schrieb:
Du arbeitest also mit der MFC, welche ja praktisch nur auf Objekten besteht und hast keine Ahnung von OOP in C++
Wenn ich hier nicht im MFC-Forum wäre dann würde ich das kommentieren, aber so lasse ich es lieber...
Wieso denn? Ich hab doch extra Objekte im Zusammenhang mit MFC geschrieben und nicht OOP