================================================= Mini-Beispiel zur Verwendung einer Shared-Library [TOC:2] ================================================= In diesem Beispiel wird eine abstrakte Basis-Klasse `Foo` definiert. Diese besitzt genaue eine Methode `msg()`. Zwei Implementierungen für diese Klasse werden vorgestellt: - In der Klasse `FooHallo` gibt die Methode `msg()` den Text _Hallo_ und - in der Klasse `FooWelt` gibt die Methode `msg()` den Text _Welt_ aus. Im Testprogramm `testit` wird eine Shared-Library geladen. Der Name wird beim Aufruf des Programmes als Parameter übergeben. Genauso gut könnte der Name der Shared-Library aber auch mittels `std::cin` zur Laufzeit in einen String eingelesen werden. In `testit` wird dann die Funktion `construct` in der Shared-Library aufgerufen, um einen Funktionszeiger auf den Constructor der Foo-Implementierung zu bekommen. Gelingt dies, so wird der Constructor aufgerufen und ein Objekt der Foo-Implementierung erzeugt. Für diese wird dann die `msg()` Methode aufgerufen. ---- SHELL (path=cpp-lecture,hide) ------------------------------ scp -r foo_so lehn@thales: ----------------------------------------------------------------- Coming up next ============== Auf der nächsten Seite (__next__) zeigen wir ein Beispiel, bei dem es notwendig ist, das Testprogramm mit `-rdynamic` zu übersetzen. :links: next -> doc:cpp-lecture/foo2_so/index Die abstrakte Klasse `Foo` ========================== :import: cpp-lecture/foo_so/foo.hpp Das Test-Programm ================= Beachtet, dass im Test-Programm nur die abstrakte Klasse `Foo` bekannt sein muss. Es werden keine weiteren Informationen über die konkreten Implementierungen benötigt oder gar verwendet. :import: cpp-lecture/foo_so/testit.cpp Übersetzen des Test-Programmes ------------------------------ ---- SHELL (hostname=lehn@thales,pathbase=./foo_so) ---- g++ -Wall -std=c++11 -o testit testit.cpp -------------------------------------------------------- Foo-Implementierung `FooHallo` ============================== :import: cpp-lecture/foo_so/foo_hallo.cpp Erzeugen von `foo_hallo.so` --------------------------- ---- SHELL (hostname=lehn@thales,pathbase=./foo_so) ------------- g++ -shared -fPIC -Wall -std=c++11 -o foo_hallo.so foo_hallo.cpp ----------------------------------------------------------------- Foo-Implementierung `FooWelt` ============================= :import: cpp-lecture/foo_so/foo_welt.cpp Erzeugen von `foo_welt.so` -------------------------- ---- SHELL (hostname=lehn@thales,pathbase=./foo_so) ------------- g++ -shared -fPIC -Wall -std=c++11 -o foo_welt.so foo_welt.cpp ----------------------------------------------------------------- Ausführen des Test-Programmes ============================= ---- SHELL (hostname=lehn@thales,pathbase=./foo_so) ------------- ./testit ./foo_hallo.so ./testit ./foo_welt.so ----------------------------------------------------------------- :navigate: up -> https://www.uni-ulm.de/mawi/mawi-numerik/lehre/wintersemester-20162017/vorlesung-objektorientierte-programmierung-mit-c/ next -> doc:cpp-lecture/foo2_so/index