const Zwei Schlüsselwörter bei der Deklaration von Variablen und Member-Funktionen haben wir noch nicht behandelt: const und static.

Ähnliche Dokumente
Software Reuse Sommer Schritt 1: Rechtschreibung, Grammatik, Wortschatz, Semantik Schritt 2: Vertiefung

Implementieren von Klassen

Einführung in die Programmierung mit C++

Design Patterns. OO-GetTogether. Volker Michels

Software-Architektur. Design Patterns. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München

Konstruktor/Destruktor

Informatik - Übungsstunde

3. Entwurfsmuster zur Entkopplung von Modulen

MSE/SWF - API Design. Arthur Zaczek. Feb 2015

Entwurfsprinzip. Entwurfsprinzip

Crashkurs C++ Wiederholung

Inhaltsverzeichnis. Vorwort Geleitwort von Grady Booch Einleitung... 23

initializer lists (nicht für Referenzen... unklar warum...)

Info B VL 11: Innere Klassen/Collections

Summary. OO Principles OO Design Principles OO Design Patterns: Past, Present and Future. 1 June

Tutorium Softwaretechnik I

Universität Karlsruhe (TH)

Software-Architektur Design Patterns

Überblick FBC SNW Zusammenfassung. Entwurfsmuster. Eine Einführung. Botond Draskoczy. Marcus Vitruvius Pollio

Java Tools JDK. IDEs. Downloads. Eclipse. IntelliJ. NetBeans. Java SE 8 Java SE 8 Documentation

Software Engineering II (IB) Design Patterns

Dynamische Datentypen. Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren

Zusammenfassung. Mit bjam und ein paar Zeilen in einem Jamroot oder Jamfile lässt sich das Kompilieren und Linken einfach automatisieren

Teil 2: Weitere Aspekte der Objektorientierung

Informatik - Übungsstunde

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

Entwurfsmuster (Design Patterns)

a.k.a. Broker a.k.a. Vermittler , Sebastian Gäng, Moritz Moll, Design Pattern, HTWG Konstanz

Algorithmen und Datenstrukturen

Informatik II. Giuseppe Accaputo, Felix Friedrich, Patrick Gruntz, Tobias Klenze, Max Rossmannek, David Sidler, Thilo Weghorn FS 2017

12. Java Klassen. Klassen - Technisch. Beispiel: Erdbebendaten. Klassen - Konzeptuell

Software Engineering. 10. Entwurfsmuster II. Franz-Josef Elmer, Universität Basel, HS 2015

Behavioral Patterns. Seminar Software-Entwurf WS 04/05. Przemyslaw Dul

Creational Patterns. Seminar Software-Entwurf. Thomas Liro WS 2004/05.

Design Patterns. (Software-Architektur) Prof. Dr. Oliver Braun. Letzte Änderung: :12. Design Patterns 1/26

Sichtbarkeiten, Klassenmember und -methoden

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

3. Entwurfsmuster zur Entkopplung von Modulen. Übersicht zu Entwurfsmustern

Praxisorientierte Einführung in C++ Lektion: "Static Members"

Software Engineering II (IB) Design Patterns

1 Klassen und Objekte

kurze Wiederholung class templates

Objektorientierte PL/SQL-Entwicklung Ein Erfahrungsbericht aus Sicht von JAVA-Entwicklern

Tutorium Softwaretechnik I

Universität Bremen. Entwurfsmuster. Thomas Röfer. Wettbewerb Motivation Erzeugende Muster Strukturelle Muster Verhaltensmuster

Visuelle Kryptographie. Anwendung von Zufallszahlen

Lambda-Funktionen. Lambda-Funktionen. Lambda-Funktionen sollen

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Praxisorientierte Einführung in C++ Lektion: "Virtuelle Methoden"

Vererbung und Polymorphie

C++ Kurs Teil 3. Standard Template Library (STL) Kommunikation mit der shell Hyper Text Markup Language (HTML)

Structural Patterns. B. Sc. Andreas Meißner

Übungsstunde: Informatik 1 D-MAVT

13. Java Klassen. Lernziele. Klassen - Technisch. Definition: Klassen

Angewandte Mathematik und Programmierung

Algorithmen zur Datenanalyse in C++

Repetitorium Programmieren I + II

Innere Klassen. Innere Klassen. Page 1. Lernziele: innere Klassen, statische geschachtelte Klassen, anonyme Klassen.

Statische und Nichtstatische Methoden Properties/ Eigenschaften

Grundlagen der Programmierung in C Klassen

Data Structures. Christian Schumacher, Info1 D-MAVT Linked Lists Queues Stacks Exercise

Prozeduren vs. Funktionen

Java Idioms. Basic und Advanced Java Coding Style. Prof. Dr. Nikolaus Wulff

Vorlesungsprüfung Programmiersprache 1

Programmierkurs. Steffen Müthing. November 30, Interdisciplinary Center for Scientific Computing, Heidelberg University

SE Besprechung. Übung 4 Architektur, Modulentwurf

Probeklausur. Musterlösung

10.4 Konstante Objekte

DAP2-Programmierpraktikum Einführung in C++ (Teil 2)

Thomas Sillmann. Swift im Detail HANSER

Order Ansicht Inhalt

C++ Klassen weitere Funktionen

Die abgeleiteten Klassen Kreis und Viereck erben die Elemente des Basisklasse und verfügen über zusätzliche Eigenschaften (Seitenlänge,

Universität Bremen. Entwurfsmuster. Thomas Röfer. Motivation Erzeugende Muster Strukturelle Muster Verhaltensmuster

12 Abstrakte Klassen, finale Klassen und Interfaces

Test Driven Development

Informatik für Mathematiker und Physiker Woche 7. David Sommer

C++11. neu in C++11: range-based for. Objektorientierte Programmierung mit C++ Ersetzung durch: 1. Elementares C++ int array[] = { 1, 2, 3, 4, 5 };

Informatik für Mathematiker und Physiker Woche 2. David Sommer

Algorithmen und Datenstrukturen

Entwurfsmuster. Rainer Schmidberger

Allgemeines - Prinzipien

9. Funktionen Teil II

1 Abstrakte Klassen, finale Klassen und Interfaces

Vererbung. Definition Felder Konstruktor Methoden Beispiel. Dr. Beatrice Amrhein

Copy-on-write und Implicit Sharing in Qt

Als erstes definiere ich einen Datentyp für einen Zeiger auf eine Funktion, die ein Element der Menge bearbeiten kann:

Übungsstunde: Informatik 1 D-MAVT

Informatik 1 Kurzprüfung 2 LÖSUNG

Programmiermethodik 3. Klausur Lösung

Informatik 1 ( ) D-MAVT F2011. Klassen, Funktionen. Yves Brise Übungsstunde 9

C++ Teil 5. Sven Groß. 12. Nov IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 16

Kapitel 10 Delegationsvariablen

Prof. Dr. Wolfgang Schramm. Vorlesung. Techniken der Programmentwicklung. Exkurs: Anonyme Klassen

Stephan Brumme, SST, 3.FS, Matrikelnr

Objektorientierte Programmierung mit C++

Numerische Methoden und Algorithmen in der Physik

Übergang von funktionaler zu OOP. Algorithmen und Datenstrukturen II 1

Transkript:

const Zwei Schlüsselwörter bei der Deklaration von Variablen und Member-Funktionen haben wir noch nicht behandelt: const und static. Eine const Variable kann ihren Wert nicht ändern: const double pi = 3.1415; C++ kennt Konstanten. Also sind #define-anweisungen als Konstantenersatz überflüssig und zu vermeiden. Wenn Argumente von Funktionen konstante Variablen (insbesondere konstante Referenzen und Pointer) sein können, dann sollte man sie aus Sicherheitsgründen unbedingt konstant machen. Mathematische und physikalische Konstanten muss man nicht selbst definieren: For example function boost::math::constants::pi<float>() returns the maximally accurate PI value for float type. Even though they are functions, they don t really calculate the value at run-time; they just return a constant. I think this is much better than M_PI. Und: http://www.gnu.org/software/gsl/manual/html_node/physical-constants.html Eine const deklarierte Member-Funktion einer Klasse kann den Zustand einer Instanz dieser Klasse nicht ändern (kann keine Member-Variablen der Instanz verändern und kann keine nicht-konstanten Funktionen aufrufen). Beim Design einer Klasse sollte man sich gleich überlegen, welche Methoden konstante Werte zurück liefern, und welche Methoden selbst konstant gemacht werden können. Je mehr Rückgabewerte, Argumente und Methoden als konstant deklariert werden können, je besser. Wenn man Konstanten braucht, dann sollte man das dafür vorgesehene Sprachmittel const type name auch benutzen!

static Das Schlüsselwort static hat unterschiedliche Bedeutung, je nachdem wo es steht: Innerhalb einer Funktion vor einer Variablen-Deklaration: Die Variable wird nicht bei jedem Aufruf der Funktion initialisiert, sondern nur einmal beim Programmstart. #include <iostream> void teststatic() { int counter = 0; std::cout << counter now is << counter << std::endl; counter++; return; int main() { for (int i=0; i<10; i++) teststatic(); return 0; #include <iostream> void teststatic() { static int counter = 0; std::cout << counter now is << counter << std::endl; counter++; return; int main() { for (int i=0; i<10; i++) teststatic(); return 0; In einer Klassen-Definition vor einer Member-Variablen-Deklaration: Alle Instanzen der Klasse teilen sich die Variable. static member variables existieren schon bevor der erste Konstruktor der Klasse aufgerufen wurde. static member variables werden.cc-file initialisert: int TestStaticClass::counter = 0;

static Schreibt eine TestStaticClass Mit einer static member variable int counter Mit einem default ctor, der die eryeugten Instanzen zählt Mit einer int counted() Methode, die den Zählerstand zurück liefert Schreibt ein main()-programm Das 7 Instanzen von TestStaticClass erzeugt Das nach dem Erzeugen jeder Instanz den Zähler abfragt und ausgibt. Nicht vergessen: den Zähler in TestStaticClass.cc initialisieren!

static Das Schlüsselwort static hat unterschiedliche Bedeutung, je nachdem wo es steht: Vor einer Member-Funktions-Deklaration: static member functions existieren ausserhalb aller Instanzen der Klasse, und es gibt sie folglich schon bevor der erste ctor der Klasse aufgerufen wurde (genau wie bei einer static member variable) Aufruf einer static member function: int result = TestStaticClass::nofCalls(); Baut in TestStaticClass eine static member function int nofcalls() ein, die zurückliefert, wie oft sie schon aufgerufen wurden. Testet nofcalls() in eurem main(). Wir können eine Variable in einer Funktion so deklarieren, dass sie ihren Wert zwischen den Aufrufen behält. Wir können sicher stellen, dass es von einer Member-Variablen nur eine Kopie gibt. Wir können dafür sorgen, dass es von einer Member-Funktion nur eine Kopie gibt. Wie können wir erreichen, dass es von einer Klasse höchstens eine Instanz gibt?

static Das Schlüsselwort static hat unterschiedliche Bedeutung, je nachdem wo es steht: Vor einer Member-Funktions-Deklaration: static member functions existieren ausserhalb aller Instanzen der Klasse, und es gibt sie folglich schon bevor der erste ctor der Klasse aufgerufen wurde (genau wie bei einer static member variable) Aufruf einer static member function: int result = TestStaticClass::nofCalls(); Baut in TestStaticClass eine static member function int nofcalls() ein, die zurückliefert, wie oft sie schon aufgerufen wurden. Testet nofcalls() in eurem main(). Wir können eine Variable in einer Funktion so deklarieren, dass sie ihren Wert zwischen den Aufrufen behält. Wir können sicher stellen, dass es von einer Member-Variablen nur eine Kopie gibt. Wir können dafür sorgen, dass es von einer Member-Funktion nur eine Kopie gibt. Wie können wir erreichen, dass es von einer Klasse höchstens eine Instanz gibt? Mit dem Singleton Design Pattern

Design Patterns Design Patterns sind bewährte Design-Lösungen zu bekannten, häufiger auftretenden Problemen in der Softwareentwicklung. Warum Design Patterns? Zeitersparnis: Die Lösung des Problems wurde schon von anderen erarbeitet Fehlerfreiheit: Design Patterns sind bewährte, getestete Lösungen Vereinfachte Weiterentwicklung: Andere Entwickler erkennen eine Design Pattern wieder und verstehen dadurch fremden, geerbten Code schneller Welche Patterns gibt es? Creational design patterns Abstract Factory: Creates an instance of several families of classes Builder: Separates object construction from its representation Factory Method: Creates an instance of several derived classes Object Pool: Avoid expensive acquisition and release of resources by recycling objects that are no longer in use Prototype: A fully initialized instance to be copied or cloned Singleton: A class of which only a single instance can exist Structural design patterns Adapter: Match interfaces of different classes Bridge: Separates an object s interface from its implementation Composite: A tree structure of simple and composite objects Decorator: Add responsibilities to objects dynamically Facade: A single class that represents an entire subsystem Flyweight: A fine-grained instance used for efficient sharing Private Class Data: Restricts accessor/mutator access Proxy: An object representing another object

Design Patterns Welche Patterns gibt es? Behavioral design patterns Chain of responsibility: A way of passing a request between a chain of objects Command: Encapsulate a command request as an object Interpreter: A way to include language elements in a program Iterator: Sequentially access the elements of a collection Mediator: Defines simplified communication between classes Memento: Capture and restore an object's internal state Null Object: Designed to act as a default value of an object Observer: A way of notifying change to a number of classes State: Alter an object's behavior when its state changes Strategy: Encapsulates an algorithm inside a class Template method: Defer the exact steps of an algorithm to a subclass Visitor: Defines a new operation to a class without change... Unser Problem war es sicher zu stellen, dass es nur eine Instanz einer Klasse geben darf: Singleton: A class of which only a single instance can exist Lösung: Niemand ausser einer Methode der selben Klasse darf den ctor der Klasse aufrufen können: Der ctor wandert von public nach protected.

Design Patterns // singleton.h class Singleton { public: static Singleton& instance() { // das einzige Objekt dieser Klasse erzeugen und als Referenz zurückgeben // singleton ist eine statische Variable in einer statischen Member-Funktion static Singleton singleton; return singleton; Singleton::instance().doSomething(); void dosomething() { protected: Singleton() { // Auch der Copy-Konstruktor muss protected sein, damit niemand Kopien macht Singleton(const Singleton& other) { ; Es gibt noch weitere, leicht andere Implementierungen des Singleton Patterns. Macht aus der TestStaticClass ein Singleton. Lasst counted() zählen, wie oft es aufgerufen wurde. Holt euch in main() eine Reihe von TestStaticClass-Referenzen, und gebt jedesmal den Wert von counted() aus (um zu testen, dass ihr immer mit der selben Instanz redet).