std::vector definieren
-
@Akari:
Danke, das wars.Ich bin fälschlicherweise davon ausgegangen, das die Variable und damit auch die Struktur bekannt ist, wenn die Codevervollständigung funktioniert.
Gruß Udo
-
@Braunstein:
Zuerst hatte ich natürlich den Typ in der Deklaration stehen, aber das hat natürlich auch nicht funktioniert.Wo müßte denn die Forward-Deklaration stehen, in der MainForm oder ?
Gruß Udo
-
Die müsste vor der Deklaration in der entsprechenden Headerdatei (MDI-Formular) stehen. Die Mainform kennt den Typ doch.
-
Hallo
Nein eine Forward Declaration bringt hier nichts, da du ja nicht mit Pointern als Elementtyp arbeitest. Der Compiler muß den ganzen Elementtyp kennen.
bis bald
akari
-
Das ist in diesem Fall egal da es ja nur eine Deklaration ist. Auch bei Templateargumenten und Funktionsparametern genügen Forwarddeklarationen vor der Deklaration im Header. Spätestens bei der ersten Verwendung (z.Bsp. Konstruktor) muß der konkrete Typ aber bekannt sein.
-
Hallo
Nein eine Forward Declaration reicht nicht aus. Einfacher Test :
Neues Projekt, Zusätzliche Unit mit class Test...
Dann in der Headerdatei der eigentlichen Hauptunit :#include <vector> ... class Test; std::vector<Test> test; ...Fehlermeldung vom Compiler :
memory.stl : Undefinierte Struktur 'Test'
Dabei spielt es auch keine Rolle ob als global oder Member.
Erst das includen vom Header von Unit2 im Header von Form1 löst das Problem und macht die Forward Declaration überflüssig.
Das liegt daran das vector eben Instanzen des Elementtypes kopieren und deren Größe kennen muß, und zwar bereits beim Deklarieren, nicht erst beim Benutzen.bis bald
akari
-
@Braunstein:
Ich habe das ganze jetzt mit forward-Deklarationen gemacht.Es wird fehlerfrei compiliert, aber der Debugger sagt mir, das die in der Struktur definierten Felder keine Elemente des vector sind.Gruß Udo
-
@akari
Ich habe den gleichen Test gemacht und keine Probleme damit gehabt sofern in der cpp-Datei die Deklaration bekannt war (BCB5 und BCB2007).
[edit]Das liegt daran das vector eben Instanzen des Elementtypes kopieren und deren Größe kennen muß
Wenn der vector ein member der Klasse ist wird erst beim Aufruf des Konstruktors eine Instanz erzeugt und somit muß auch erst da der Objekttyp vollständig bekannt sein.
[edit]@Udo_11
Keine Ahnung woran das jetzt liegt. Es könnte sein, dass der Debugger die Deklaration nicht kennt.
-
Kommando zurück!!!
Mein letzter Post war falsch. Auch mit Forward-Deklarationen gehts.
in der MainForm.h:... ... struct ndata { String profil; double tonnage; int anzahl; } ; //---------------------------------------------------------------------------- class TMainForm : public TForm { ... ...In den MDI-Formularen(.cpp):
... ... struct ndata; std::vector<ndata> ch_data; //--------------------------------------------------------------------------- __fastcall Twk_leben::Twk_leben(TComponent* Owner) : TForm(Owner) { ... ...Gruß Udo
-
Hallo
Braunstein schrieb:
@akari
Ich habe den gleichen Test gemacht und keine Probleme damit gehabt sofern in der cpp-Datei die Deklaration bekannt war (BCB5 und BCB2007).Ah okay. Wenn ich die Deklaration als Member des Forms (und nicht global) verlagere und in der cpp den Include einfüge, dann kompiliert es wirklich.
bis bald
akari
-
@Akari und Braunstein
Danke für Eure Hilfe!
Habt Ihr Euch meine letzten Codeausschnitte mal angeschaut?
Kann man das so stehen lassen?Gruß Udo
-
Hallo
Ja das ist in Ordnung.
bis bald
akari