Javas ArrayList<Object> nach C++ bringen
-
Servus,
wie mache ich das?
Die ArrayList kann ich ja leicht mit einem Vektor portieren aber wie bekomme ich es hin, dass der Vektor 'irgendwelche' Objekte fassen darf?
Danke vorab.
-
Mir fällt spontan
boost::anyein
-
Nicht vernünftig. Aber das will man ja idR auch nicht. In Java macht man das ja auch nicht mehr. Man arbeitet hier mit Interfaces und steckt eben Zeiger auf SomeInterface in den Container.
In Java schreibt man heute ja auch kein ArrayList<Object> sondern ein ArrayList<SomeInterface>. Wenn du wirklich wirklich unbedingt auf alle Fälle aber einen untypisierten Zeiger brauchst gibt es 2 Wege:
- du speicherst void*
- du verwendest boost::variant oder boost::any
Die korrkete Lösung aber ist, keine untypisierten Container zu haben. Alle Objekte die da rein kommen müssen sowieso irgendeine Gemeinsamkeit haben, sonst würdest du sie ja nicht zusammenfassen wollen. Ergo ein Interface für diese Gemeinsamkeit bestimmen und dieses dann verwenden.
-
Danke, ich behelfe mich nun mal vorerst mit struct und wenn klar ist, was da alles rein muss dann bilde ich ein Interface. Interface in Cpp heisst ich bastle eine Klasse die dann etwa 'rollable' heißt und lasse die tatsächlich verwendeten Cpp-Objekte von dieser Klasse erben?
-
Zu Interfaces hab ich grad hier (http://www.c-plusplus.net/forum/279786) ein Topic eröffnet wo du mal reinsehen kannst.
-
Jay1980 schrieb:
Danke, ich behelfe mich nun mal vorerst mit struct und wenn klar ist, was da alles rein muss dann bilde ich ein Interface. Interface in Cpp heisst ich bastle eine Klasse die dann etwa 'rollable' heißt und lasse die tatsächlich verwendeten Cpp-Objekte von dieser Klasse erben?
Jap. Die Klasse, die du als Interface brauchst, sollte dann meistens abstrakt sein.
-
Jay1980 schrieb:
wie mache ich das?
Die ArrayList kann ich ja leicht mit einem Vektor portieren aber wie bekomme ich es hin, dass der Vektor 'irgendwelche' Objekte fassen darf?
Ich habe ein bisschen den Eindruck, als ob Du die Unterschiede zwischen Java und C++ unterschätzen würdest. Natürlich ist ArrayList<T> nicht das gleiche wie std::vector<T> -- eher std::vector<T*>. Aber wenn Du überall nur T* benutzt und die Objekte im Heap anlegst (per new), muss die auch jemand wieder löschen. Garbage Collection gibt's in C++ nicht von Haus aus. Ein Quick-Fix wäre vielleicht std::vector<boost::shared_ptr<T> >. Aber auch hier muss man aufpassen, da "Verweis-Zyklen" nicht erkannt werden und es dann doch Speicherlecks geben könnte. In C++ ordnet man oft einer "Resource" (wie zB im Freispeicher angelegtes Objekt) einem Besitzer (typischerweise ein anderes Objekt) zu und wälzt die Verwaltung/Verantwortung bzgl Freigeben der Resource auf das Besitzer-Objekt ab. Bei shared_ptr teilen sich eventuell mehrere shared_ptr-Objekte den "Besitz", daher auch "shared". Alternativ kannst Du natürlich auch irgendwo einen std::vector<T> anlegen und an anderen Stellen Zeiger speichern. Aber auch das ist nicht ungefährlich, da der Vector seine Objekte an eine andere Stelle umkopieren könnte, zwecks Vergrößerung des Vectors. Dann sind all Deine rohen Zeiger ungültig.
Bzgl Interfaces und co. ... das klingt eher nach vector<abc*> oder vector<shared_ptr<abc> >, wobei abc = abstract base class. ... Und da fällt mir gerade ein, dass ich neulich boost::ptr_vector<abc> verwendet hatte. So etwas gibt's dann auch noch.

Ich halte nicht viel von Versuchen ein Programm 1:1 von Java nach C++ zu übersetzten. Das ist einfach eine andere Sprache, in der man viele Dinge ganz anders formuliert als in Java. Ein bischen so, als wolltest Du ein japanisches Gedicht auf Deutsch übersetzen. Da geht einiges verloren. Jedenfalls kannst Du nicht erwarten, dass Du als C++ Neuling -- auch wenn Du Java perfekt beherrschst -- auf Anhieb eine C++ Version Deines Programms zaubern kannst, was annähernd nach "vernünftigem C++" aussieht.
-
krümelkacker schrieb:
Jay1980 schrieb:
wie mache ich das?
Die ArrayList kann ich ja leicht mit einem Vektor portieren aber wie bekomme ich es hin, dass der Vektor 'irgendwelche' Objekte fassen darf?
Ich habe ein bisschen den Eindruck, als ob Du die Unterschiede zwischen Java und C++ unterschätzen würdest. Natürlich ist ArrayList<T> nicht das gleiche wie std::vector<T> -- eher std::vector<T*>. Aber wenn Du überall nur T* benutzt und die Objekte im Heap anlegst (per new), muss die auch jemand wieder löschen. Garbage Collection gibt's in C++ nicht von Haus aus. Ein Quick-Fix wäre vielleicht std::vector<boost::shared_ptr<T> >. Aber auch hier muss man aufpassen, da "Verweis-Zyklen" nicht erkannt werden und es dann doch Speicherlecks geben könnte. In C++ ordnet man oft einer "Resource" (wie zB im Freispeicher angelegtes Objekt) einem Besitzer (typischerweise ein anderes Objekt) zu und wälzt die Verwaltung/Verantwortung bzgl Freigeben der Resource auf das Besitzer-Objekt ab. Bei shared_ptr teilen sich eventuell mehrere shared_ptr-Objekte den "Besitz", daher auch "shared". Alternativ kannst Du natürlich auch irgendwo einen std::vector<T> anlegen und an anderen Stellen Zeiger speichern. Aber auch das ist nicht ungefährlich, da der Vector seine Objekte an eine andere Stelle umkopieren könnte, zwecks Vergrößerung des Vectors. Dann sind all Deine rohen Zeiger ungültig.
Bzgl Interfaces und co. ... das klingt eher nach vector<abc*> oder vector<shared_ptr<abc> >, wobei abc = abstract base class. ... Und da fällt mir gerade ein, dass ich neulich boost::ptr_vector<abc> verwendet hatte. So etwas gibt's dann auch noch.

Ich halte nicht viel von Versuchen ein Programm 1:1 von Java nach C++ zu übersetzten. Das ist einfach eine andere Sprache, in der man viele Dinge ganz anders formuliert als in Java. Ein bischen so, als wolltest Du ein japanisches Gedicht auf Deutsch übersetzen. Da geht einiges verloren. Jedenfalls kannst Du nicht erwarten, dass Du als C++ Neuling -- auch wenn Du Java perfekt beherrschst -- auf Anhieb eine C++ Version Deines Programms zaubern kannst, was annähernd nach "vernünftigem C++" aussieht.
Kann nur zustimmen, dass die Unterschiede sehr gross sind.Man hört ja oft, dass Java und C++ sehr ähnlich sind. Ich dachte das auch, bis ich angefangen habe C++ zu lernen. Ich habe dann ziemlich schnell aufgeben in C++ wie in Java zu programmieren

-
icarus2 schrieb:
Man hört ja oft, dass Java und C++ sehr ähnlich sind. Ich dachte das auch, bis ich angefangen habe C++ zu lernen. Ich habe dann ziemlich schnell aufgeben in C++ wie in Java zu programmieren

Leider muss ich an der Uni mit beidem programmieren, was mich manchmal zum Ausrasten bringt, wenn ich wieder was vermische

-
Christian Ivicevic schrieb:
icarus2 schrieb:
Man hört ja oft, dass Java und C++ sehr ähnlich sind. Ich dachte das auch, bis ich angefangen habe C++ zu lernen. Ich habe dann ziemlich schnell aufgeben in C++ wie in Java zu programmieren

Leider muss ich an der Uni mit beidem programmieren, was mich manchmal zum Ausrasten bringt, wenn ich wieder was vermische

Ja, das ist manchmal nicht einfach. Bei mir ist es Java, C++, C# und Eiffel. Ist nicht immer einfach umzudenken

-
icarus2 schrieb:
Man hört ja oft, dass Java und C++ sehr ähnlich sind. Ich dachte das auch, bis ich angefangen habe C++ zu lernen. Ich habe dann ziemlich schnell aufgeben in C++ wie in Java zu programmieren

Programmier mal mit ABAP, dann weiß du was anders ist.