Dynamisches laden in C++

Hi,

ich würde gerne eine App entwickeln, in der ich Funktionalität über dyn. laden nachträglich hinzufügen kann. In C kein Problem.
Aber in C++. Hat da wer Erfahrungen? Mir ist klar, das ich auf den selben Compiler setzen muss, und so weiter. Interessant wirds mit Klassen. Ich dachte an Interfaces, also pure virtual classes, von denen Objekte dann ableiten müssten. Geht das?

MfG Diez

Moin,

Aber in C++. Hat da wer Erfahrungen? Mir ist klar, das ich auf
den selben Compiler setzen muss, und so weiter. Interessant
wirds mit Klassen.

Da gibt es Muster in ‚Design Patterns‘ (0201633612). Mir fallen gerade die Namen nicht ein, aber das Buch ist eh dringend zu empfehlen.

Thorsten

Hi,

ich kenne das Buch. Aber das ist doch eher abtrakt bzw. beschäftigt sich halt mit Mustern, und nicht konkreten
Implementierungen. Bsp: Wenn ich das ganze unter JAVA mache, habe ich kein Probleme.

MfG Diez

Moin,
Da gibt es Muster in ‚Design Patterns‘ (0201633612). Mir
fallen gerade die Namen nicht ein, aber das Buch ist eh
dringend zu empfehlen.

Thorsten

Hi,

über dyn. laden nachträglich hinzufügen kann. In C kein
Problem.

??? Wie machst Du das denn? Bist Du da heftigst mit Funktionspointern am jonglieren?

Interessant
wirds mit Klassen. Ich dachte an Interfaces, also pure virtual
classes, von denen Objekte dann ableiten müssten. Geht das?

Das geht nicht nur, dass ist imho der einzig vernuenftige Programmierstil.
Aber C++ waer nicht C++, wenns da nicht boese Fallstricke gaebe. Interfaces gibt es in C++ nicht, wohl aber pure virtual classes (obwohl die die leider nicht gar so pure sein muessen). Weil es keine Interfaces gibt und pure virtual classes Teilimplementationen habe koennen ist Vorsicht mit multiple inheritance geboten (Probleme treten nur dann auf, wenn von zwei Klassen abgeleitet wird, die irgendwo eine gemeinsame Basisklasse haben).
Ausserdem haben members bei C++ nicht automatisch Zugriff auf die Klassen zu denen sie gehoeren. Daher muss man explizit this an public member friend classes uebergeben, wenn man wie in Java call backs verwirklichen will.
Und zum Trost gibt es Templates ;->

Sorry, dass ich einen so groben Rundumschlag gepostet habe. Wenn Du konkretere Fragen hast, versuche ich gerne zu helfen.
Ein nicht ganz so abstraktes und sehr hilfreiches Buch in Design- und Syntaxfragen ist uebrigens „Thinking in C++“ von Bruce Eckel, kostenlos downloadbar unter http://www.bruceeckel.com/

Gruss

Thorsten

Moin,

ich kenne das Buch. Aber das ist doch eher abtrakt bzw.
beschäftigt sich halt mit Mustern, und nicht konkreten
Implementierungen.

Logisch. Sonst wäre ich arbeitslos.

Bsp: Wenn ich das ganze unter JAVA mache, habe ich kein
Probleme.

Welche Probleme kommen unter C++ hinzu? fehlen irgendwelche Sprachelemennte?

Thorsten

Hi,

Welche Probleme kommen unter C++ hinzu? fehlen irgendwelche
Sprachelemennte?

So kann man sagen. Das Problem ist, das C++ objektorientierung nur zur compile-, nicht aber zur Laufzeit kennt.
Deshalb gibts in C++ ja auch die Deklaration extern „C“. Und man kann solche Tricks auch nur mit dem gleichen Compiler machen, da C++ keine vorschriften über den internen Aufbau von Objekten macht. Methode x in Objekt A ist beim VCC anders anzusprechen als beim g++.

Mittels virtueller Methoden kann man da ein bisschen was machen, aber die Frage ist eben, was passiert wenn ich die Lib nicht zeitgleich mit dem Rest erstellt habe (also aus modularisierungsgruenden), sondern eben von einem dritten einfach hinzugenommen habe.

MfG Diez

Moin,

Welche Probleme kommen unter C++ hinzu? fehlen irgendwelche
Sprachelemennte?

So kann man sagen. Das Problem ist, das C++ objektorientierung
nur zur compile-, nicht aber zur Laufzeit kennt.

Verstehe. Dann mußt Du Headerdateien verteilen oder ein wenig tiefer in die Trickkiste greifen und Highlevel-OO-Technologien verwenden.

Aber Du solltest nochmal jemanden mit mehr C+±Erfahrung fragen.

Thorsten

Hi Diez :smile:

Ich dachte an Interfaces, also pure virtual
classes, von denen Objekte dann ableiten müssten.
Geht das?

Das geht nicht nur, dass ist der Standardweg unter Winodws!!! Windows ist komplett modular aufgebaut. Microsoft verwendet COM (haben die selber erfunden), das steht für „Component Object Model“. Mittels COM können DLLs und EXEs über vorher festgelegte Schnittstellen Daten austauschen und Funktionen anderer DLLs und EXEs aufrufen. Dieser Austausch funktioniert sogar in LANs und WANs! Besonders interessant ist, dass man bei COM nur den Binärcode verwendet, nicht den Source. Daher ist es völlig egal, in welcher Programmiersprache deine COM-Dateien geschrieben sind. Wir z.B. entwickeln COM-Dateien unter C++ und klicken sie dann mit Visual-Basic zu einer Anwendung zusammen …

COM-Dateien sind ohne Hilfsmittel ziemlich ätzend zu entwickeln. Die MFC helfen einem ein bisschen, aber richtig gut wird es erst mit ATL. Wenn du den Visual C++ 6 Compiler hast, dann spiel mal ein bisschen mit ATL und COM rum. Es lohnt sich :smile:

cu Stefan.

Hi,

danke fuer die ausfuehrliche Antwort. Leider hilft die mir nicht. Denn mit COM/MFC/ATL/CORBA usw. kenne ich mich zur genüge aus - aber unter LINUX hilft mir das nix. Ich habe aber gestern einfach mal ein kleines Testprojekt gebaut - es klappt mir pure virtual classes sehr gut.

Du hast aber wie gesagt voellig recht, das Componentenmodelle
wäaren prinzipiell die Lösung dafür.

Davon abgesehen sei mir als M$-Hasser (nicht wirklich, habe lange genug darauf entwickelt :smile:) der Hinweis erlaubt, das M$ COM mitnichten „erfunden“ hat. COM ist eine Implementation eines Komponentenmodells. CORBA ist eine andere. RPC, DCE usw. auch. Und von JAVA RMI ganz zu schweigen. Allerdings ist COM recht schnell, und nat. in das System sehr gut integriert.

MfG Diez

Hi,

jetzt habe ich erst verstanden, was Du wirklich willst, sorry.
Dafuer ist Java natuerlich ideal. Kaum eine Sprache (vielleicht noch Python) ist daruaf so ausgelegt wie Java. Mit C++, pure virtual und dynamischem gelinkten libraries muesste es gehen, das hast Du aber wohl selbst rausgefunden. Das hoert sich fuer mich aber Aerger und akuten Problemen beim dynamischen linken an, wenn der core Code und die dynamischen libraries nicht aus einer Hand kommen und die „Interfaces“ sich noch entwickeln (wie es bei einem Grossteil der interessanten Linux-Libs der Fall ist). CORBA ist ein gefuerchtetes Bulkware System (Overhead2), ansonsten dafuer aber wohl gut geeignet (und ehrlich, ich habe keine Probleme mit Overhead, wenns nicht allzu low level ansetzt).
Evtl. waere es fuer Dich interessant, Dich mal mit dem GNU autoconfig/automake System vertraut zu machen, da werden vermutlich derartige Probleme angesprochen - ich kenne mich da aber nicht so doll aus (schau mal unter http://www.airs.com/ian/configure/). Ich habe gerade ein Tool fuer C gefunden, sie mal unter http://www.gnu.org/software/dld/dld.html nach.
Ok, ich hoffe, ein wenig geholfen zu haben.

Viel Glueck :wink:

Thorsten

Hi,

mir ist noch etwas eingefallen. Python kommt momentan ziemlich in Mode. Da kann man C++ backends schreiben und die aus Python ziemlich dynamisch einbinden. Fuer hoehere Abstraktionsebenen ist das vermutlich ein geeigneterer Ansatz als zu versuchen, das direkt aus C++ zu handhaben. Und Python ist extrem einfach zu lernen und ueberhaupt eine unglaublich geile Sprachen (angeblich noch angenehmer darin zu entwickeln als mit Java, aber in die Tiefen bin ich da auch noch nicht eingestiegen).

Gruss

Thorsten

Hi,

Python ist echt cool - kann ich schon :smile: Wobei ich der Aussage
„leichter als JAVA“ nicht unbedingt zustimmen würde. Auf jeden Fall tut sich bei Python eine Menge, es gibt kaum etwas, was es nicht gibt. Und der bytecode ist sogar binaerkompatibel auf verschiedenen Plattformen (Win32/UNIX). Das Problem bei Python ist IMHO der etwas unuebersichtlichere Code (den man mit coding-conventions nicht aendern kann - die sind eingebaut :smile:), und nat. die fehlende industrielle Unterstützung. ZOPE ist das einzige Projekt, das ich kenne.

zu deinem anderen Posting: automake/autoconf nutze ich natürlich, aber das hat so direkt nix damit zu tun. Im Grunde will ich das ja eben nicht haben: Ich will PlugIns, und die sollen von anderen kommen. Und nicht extra eincompiliert werden müssen. Wie schon richtig bemerkt: Componentenmodelle sind da das beste. Aber CORBA ist mir für die konkrete Applikation dann doch etwas zu hoch gehangen. Und deshalb bin ich ja gerade auf der Suche nach Erfahrungen, insbesondere mit mixturen aus virtuellen Klassen (interfaces) und gemeinsamen code. Also zB Klassen, die verwendet werden um Events auszutauschen. Irgendwo müssen die Daten ja herkommen :smile:

Das ganze soll übrigens parallel auch in JAVA _und_ Python (und nat. C++) entwickelt werden, wobei ich mir über eine Integration noch im Unklaren bin.

MfG Diez

Danke für deine Antowrten.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi,

mir ist nochwas eingefallen. Ich bin neulich zufaellig ueber ein (open Source) Projekt gestolpert, die sowas in der Art vor haben. Urspruenglich wollten die mit CORBA arbeiten, sind davon wohl aber ab. Ich schaetze, wenn Du bei denen direkt anfragst, bekommst Du ein paar nuetzliche Informationen. Die Projektseite liegt unter:
http://www.all-day-breakfast.com/rosegarden/developm…

Gruss

Thorsten