1 Seite 1 Einführung in die Programmierung mit C++ Teil IV - Weiterführende Themen 14. Modularisierung und Automatisierung Was heißt Modularisierung? Seite 2 bisher Programm komplett in einer Datei längere Programme werden unhandlich Aufteilung des Programms in mehrere Dateien, sogenannte Module thematisch sortiert jede Klasse in eigener Datei Quelltext ist in Modul gekapselt Schnittstellen zwischen Modulen werden über Headerdateien bekannt gegeben Module übernehmen Headerdateien für andere Module die benötigt werden eigene Headerdateien sollten Dateiendung.hpp haben eigene Headerdateien werden mit #include "header.hpp" eingebunden Systemheaderdateien werden mit #include <header> eingebunden
2 Beispiel I Seite 3 Vektorklasse: main.cpp #include <iostream> #include "vector.hpp" int main() { math::vector a( 1., 0. ), b( 0., 1. ), c = a + b; std::cout << a << " + " << b << " = " << c << std::endl; return 0; Beispiel II Seite 4 Vektorklasse: vector.cpp #include <iostream> #include <cmath> #include "vector.hpp" namespace math { vector vector::operator+( const vector & v ) const { return vector( x+v.x, y+v.y ); const vector & vector::operator+=( const vector & v ) { return *this = *this + v; float vector::operator*( const vector & v ) const { return x*v.x + y*v.y; float vector::abs() const { return std::sqrt( *this * *this ); std::ostream & operator<<( std::ostream & s, const vector & v ) { return s << "( " << v.x << ", " << v.y << " )";
3 Beispiel III Seite 5 Vektorklasse: vector.hpp namespace math { class vector { private: float x, y; public: vector() { x = 0; y = 0; vector( const vector & v ) { x = v.x; y = v.y; vector( float x, float y ) { this->x = x; this->y = y; vector operator+( const vector & ) const; const vector & operator+=( const vector & ); float operator*( const vector & ) const; float abs() const; friend std::ostream & operator<<( std::ostream &, const vector & ); ; Übersetzung von modularisierten Programmen Seite 6 einfachste Version main.cpp vector.cpp vector.hpp > g++ -o vector main.cpp vector.cpp >./vector ( 1, 0 ) + ( 0, 1 ) = ( 1, 1 ) > bei Änderung einer Datei Übersetzen und Binden aller Dateien nötig Übersetzen und Binden trennen > g++ -c main.cpp > g++ -c vector.cpp main.cpp main.o vector.cpp vector.hpp vector.o > g++ -o vector main.o vector.o nur geänderte Dateien müssen neu übersetzt werden
4 Automatisierung Seite 7 make kann sich wiederholende Vorgänge automatisieren Steuerung von make erfolgt über Makefile Makefile vector: main.o vector.o g++ -o $@ $^ main.o: main.cpp vector.hpp g++ -c $@ $< vector.o: vector.cpp vector.hpp g++ -c $@ $< clean: rm *.o Verwendung I Seite 8 make arbeitet regelbasiert Regel besteht aus Ziel gefolgt von Doppelpunkt und Quellen, die unmittelbar für Ziel benötigt werden Der Regel folgt Block aus Anweisungen, die aus Quellen Ziel erstellen Anweisungsblock muß mit Tabulator eingerückt werden! Im Anweisungsblock können sogenannte automatische Variablen verwendet werden $@ wird durch das Ziel ersetzt $< wird durch erste Quelle ersetzt $^ wird durch alle Quellen ersetzt durch Leerzeichen getrennt Es gibt auch Regeln ohne tatsächliches Ziel und Quellen dienen z.b. zum Aufräumen
5 Verwendung II Seite 9 Übersetzen und Binden des Programms > make vector g++ -c main.cpp g++ -c vector.cpp g++ -o vector main.o vector.o >./vector ( 1, 0 ) + ( 0, 1 ) = ( 1, 1 ) Aufräumen > make clean main.cpp vector vector.cpp vector.hpp