in Bibliothek erstelltes Objekt weiterverwenden
-
Hallo *,
ich moechte waehrend eines Bibliothekaufrufs ein Objekt von TestClass erstellen dass von einer anderen Bibliothekfunktion genutzt werden soll:
Mein Testprogramm sieht so aus:
#include "interface.h" int main () { generateObj (); // Bibliotheksfunktion useObj (); // Bibliotheksfunktion }Das Interface zur Bibliothek:
interface.hclass TestClass; extern TestClass obj; extern "C" { void generateObj (); void useObj (); }interface.cpp
void generateObj () { TestClass t_obj (); } void useObj () { t_obj.print (); }Die Bibliothek wird ohne Fehlermeldung uebersetzt und gelinkt. Das Testprogramm kann leider nicht gelinkt werden. Was mache ich falsch?
Eine andere Moeglichkeit waere ja das Objekt aus generateObj() zurueck zu geben. Da der aufrufende Code spaeter Fortran sein soll und ich nicht weiss wie ich in Fortran das Objekt speichern kann um es useObj() uebergeben zu koennen, habe ich die Moeglichkeit vorerst ausgeschlossen.
-
warum gibt dein generateObj dieses nicht einfach als Returnwert zurück?
-
Wie geschrieben soll die Bibliothek aus Fortran heraus aufgerufen werden. Da ich nicht weiss ob (und wenn ja, wie) man in Fortran Objekte speichert, wollte ich ein statisches Objekt anlegen und meine Bibliotheksroutinen koennen das Objekt dann nutzen. Ich habe leider keine Ahnung ob das prinzipiell so moeglich ist wie ich mir das vorstelle.
-
Hi,
prinzipiell kannst Du das über eine globale Variable regeln.
Wenn es einfach nur Objekt sind, die zum Programmstart schon abgelegt werden können, ist es einfach:interface.cpp
TestClass globTestClass; // generateObj() entfällt void useObj () { globTestClass.print(); }Wenn es erst zur Laufzeit erzeugt werden kann (z.B. weil es von Inputparametern abhängig ist, die erst zur Laufzeit feststehen), musst Du das globale Objekt dynamsich erzeugen:
interface.cpp
TestClass* globTestClass = 0; void generateObj () { if(!globTestClass) globTestClass = new TestClass(); } void useObj () { if(globTestClass) globTestClass->print(); }Da musst Du Dir aber noch eine Menge Anderer Gedanken machen, z.B. was passieren soll, wenn mehrere Objekte angelegt werden wollen.
Das Abräumen sollte man auch nicht vergessen ... das kannst Du evtl. über eine eigene Verwaltungsklasse machen:struct Abraeumer { TestClass* &raeumMichAb; Abraeumer(TestClass* &p) : raeumMichAb(p) {} ~Abraeumer() { delete raeumMichAb; } }; TestClass* globTestClass = 0; Abraeumer abraeumer(globTestClass);... smart-Pointer gehen natürlich auch.
Wichtig wird das vA, wenn Deine Testclass einen "echten" Destruktor hat (also z.B. Ressourcen freigibt, die das OS nicht automatisch bei Prozessende wieder freigibt, oder irgendwelche anderen "Abschlussaufgaben" erledigt, ...)
Außerdem kann es noch beliebig kompliziert werden, wenn man mit mehreren (beliebig vielen ?) Objekten arbeiten will, Multithreading braucht, die Objekte untereinander abhängig sind, ....Gruß,
Simon2.