List Container typ Struct an Funktion übergeben, wie?
-
Hallo zusammen,
ich möchte einen Container an eine Function übergeben.
struct strdaten { int e; int x[2]; } tdaten; list<strdaten> cdaten; list<strdaten>::iterator icdaten;
Wie muss dann die Parameterliste der Funktion ausschauen?
void datentransform(list<strdaten> cinput) { ... }
Funktioniert logischerweise nicht, da strdaten ja nicht bekannt ist.
-
Hallo
dann mußt du strdaten eben bekanntmachen.
Übrigens ist besser, Container wie List als Referenz zu übergeben.bis bald
akari
-
Und wie mache ich strdaten der Parameterlist der Funktion bekannt?
Wenn ich den Container als Referenz übergebe, dann kann ich mir den Mist sparen und den Container gleich Global definieren.
Sinn und Zweck dieser Übung ist, eine Kopie des Containers zu erstellen, damit ich ihn verändern kann ohne die Originaldaten zu verändern.
-
Hallo
indem du entweder strdaten vor der Funktion deklarierst oder vor der Funktion ein #include "<headerdatei>" auf die Headerdatei machst, in der strdaten deklariert ist.
bis bald
akari
-
In etwa so:
//strdaten.h struct strdaten { int wasauchimmer; foo bar; char c; //... }; //strdatenfunktion.h #include "strdaten.h" #include <list> void mach_was(std::list<strdaten>&); //strdatenfunktion.cc #include "strdatenfunktion.h" void mach_was(std::list<strdaten>& strdl) { //... }; //main.cc #include "strdatenfunktion.h" //...
Prinzipiell musst du nur deine Struktur vor der Funktion schreiben. Wenn du mit Zeigern (geht Referenzen auch? Ich denk mal schon...) arbeitest, dürfte auch statt der gesamten Struktur
struct strdaten; void machwas(strdaten*);
Dann musst du in der Implemwentationsdatei aber trotzdem das ganze struct kennen...
-
Soweit so gut. Und wie ist es innerhalb einer Klasse?
class ctest { public: void datentransform(list<strdaten> cinput); private: struct strdaten { int e; int x[2]; } tdaten; list<strdaten> cdaten; list<strdaten>::iterator icdaten; };
Muss ich dann public und private tauschen damit die Reihenfolge stimmt?
Und wie ist es dann wenn ich zuzätlich in public ein zweites Struct habe und in private eine zweite dazugehörige Funktion? Dann geht gar nichts mehr, oder?
Ich verstehe eh nicht, warum C++ das abhängig macht wo ich was definiere. Ich habe gedacht es ist ein Compiler, der alles durchsieht und dann compiliert. Ist ja fast schon wie ein Interpreter hier. Irgendwie kapiere ich die Logik nicht, gibt es Gründe warum ein Struct vorher definiert werden muss und nicht ein paar Zeilen später?
Edit: Gerade nochmal genau gelesen. Heißt es, wenn ich das Struct in eine Headerdatei binde, sich all meine Probleme lösen? Danke.
-
Hallo
Und wie ist es dann wenn ich zuzätlich in public ein zweites Struct habe und in private eine zweite dazugehörige Funktion? Dann geht gar nichts mehr, oder?
Auch kein Problem, da du public usw. auch mehrmals vergeben kannst
Ich verstehe eh nicht, warum C++ das abhängig macht wo ich was definiere. Ich habe gedacht es ist ein Compiler, der alles durchsieht und dann compiliert. Ist ja fast schon wie ein Interpreter hier. Irgendwie kapiere ich die Logik nicht, gibt es Gründe warum ein Struct vorher definiert werden muss und nicht ein paar Zeilen später?
Du darfst nicht vergessen, das Compiler sequentiell vorgehen. Die haben eben keinen Gesamtüberblick über den gesamten Code, sondern sind immer an einer bestimmten Zeile, und nur was bis dahin deklariert ist, ist verfügbar.
Gerade nochmal genau gelesen. Heißt es, wenn ich das Struct in eine Headerdatei binde, sich all meine Probleme lösen? Danke.
Ja, du solltest die eine Extra-Datei mit allen Basistypen machen.
bis bald
akari