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

Ähnliche Dokumente
Praxisorientierte Einführung in C++ Lektion: "Namespaces"

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

Praxisorientierte Einführung in C++ Lektion: "Klassen Templates"

Praxisorientierte Einführung in C++ Lektion: "Das Schlüsselwort explicit"

Praxisorientierte Einführung in C++ Lektion: "Die Compiler-Chain (Vom Quellcode zum ausführbaren Programm)"

Praxisorientierte Einführung in C++ Lektion: "Die Compiler-Chain (Vom Quellcode zum ausführbaren Programm)"

Praxisorientierte Einführung in C++ Lektion: "Kontrollstrukturen"

1.2. Datentypen (Konstantentypen)

Praxisorientierte Einführung in C++ Lektion: "Smart-Pointer"

Praxisorientierte Einführung in C++ Lektion: "C++ Cast Operatoren"

Praxisorientierte Einführung in C++ Lektion: "Dynamische Speicherverwaltung"

Praxisorientierte Einführung in C++ Lektion: "Vererbung"

Objektorientierte Programmierung mit C Datentypen (Strukturtypen)! p.name = "Willibald Wusel";

1.4. Funktionen. Objektorientierte Programmierung mit C++

Praxisorientierte Einführung in C++ Lektion: "Der C++-11 Standard"

Variablenarten. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Algorithmen und Datenstrukturen

Crashkurs C++ Wiederholung

Einstieg in die Informatik mit Java

Einführung in die Programmierung mit C++

Thema heute: Vererbung und Klassenhierarchien. Abgeleitete Klassen. Vererbung von Daten und Funktionen. Virtuelle Funktionen

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

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

Einstieg in die Informatik mit Java

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

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

Implementieren von Klassen

Praxisorientierte Einführung in C++ Lektion: "Klassen und Strukturen"

Objektorientierte Programmierung mit C++

Arten von Klassen-Beziehungen

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

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

C++ Klassen weitere Funktionen

ADT: Verkettete Listen

Einführung in die Programmiersprache C

Klassen. Kapitel Klassendeklaration

Algorithmen zur Datenanalyse in C++

Wo und wie lange leben Objekte? globale Objekte lokale Objekte dynamische Objekte

Teil 2: Weitere Aspekte der Objektorientierung

Programmierkurs C/C++

Vorlesungsprüfung Programmiersprache 1

Einführung in die Programmiersprache C

Exkurs: ANONYME KLASSEN. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

Objektorientierte Programmierung Studiengang Medieninformatik

Arten von Klassen-Beziehungen

Objektorientierte Programmierung mit C++ den sog. default constructor X (){}

Einstieg in die Informatik mit Java

ADT: Verkettete Listen

Java Einführung Klassendefinitionen

Einführung in die Programmierung Wintersemester 2016/17

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Angewandte Mathematik und Programmierung

Repetitorium Programmieren I + II

1.5. Strukturierte Anweisungen

Erzeugungsmuster. Kapselung der Objekt-Erzeugung

Einführung in die Systemprogrammierung

Objektorientierte Programmierung mit C++

Programmieren I. Kapitel 10. Spezielle Features

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 };

Repetitorium Informatik (Java)

Klassen und Konstruktoren in Java

Einstieg in die Informatik mit Java

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

Einführung in die Programmierung mit C++

Praxisorientierte Einführung in C++ Lektion: "Operatoren"

Was Mathematiker schon vor Jahrhunderten erfunden haben, gibt es jetzt endlich in ihrer Programmiersprache:

Praxisorientierte Einführung in C++ Lektion: "Exceptions"

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Methoden und Klassen. Silke Trißl Wissensmanagement in der Bioinformatik

Initialisierung vs. Zuweisung:

Aufbau von Klassen. class punkt {...

Programmierung und Angewandte Mathematik

Numerische Methoden und Algorithmen in der Physik

Angewandte Mathematik und Programmierung

C++ Klassen, Vererbung. Philipp Lucas. Sebastian Hack. Wintersemester 2008/09. saarland.

HSR Rapperswil 2001 Markus Rigling. Programmieren: Smart Pointer Auflage

Praxisorientierte Einführung in C++ Lektion: "Operatoren"

Programmieren in C++ Klassen

Praxisorientierte Einführung in C++ (Variadische Funktionen)

ADT: Verkettete Listen

! "eine Zeichenkette\nmit Doppelapostroph \" und Backslash \\"

C++ Teil 12. Sven Groß. 18. Jan Sven Groß (IGPM, RWTH Aachen) C++ Teil Jan / 11

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

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Objekte und Klassen. INE2 M. Thaler, Office TG ZHAW, M. Thaler, K. Rege, G. Burkert, E.

einlesen n > 0? Ausgabe Negative Zahl

Variablen und Parameter

Informatik 1 ( ) D-MAVT F2010. Rekursion, Signaturen. Yves Brise Übungsstunde 8

kurze Wiederholung class templates

Das Ersetzbarkeitsprinzip

Konstruktor/Destruktor

Hydroinformatik I: Klassen

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

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

Informatik - Übungsstunde

Algorithmen zur Datenanalyse in C++

Transkript:

Praxisorientierte Einführung in C++ Lektion: "Static Members" Christof Elbrechter Neuroinformatics Group, CITEC May 28, 2014 Christof Elbrechter Praxisorientierte Einführung in C++ May 28, 2014 1 / 11

Table of Contents Allgemeines Singleton Christof Elbrechter Praxisorientierte Einführung in C++ May 28, 2014 2 / 11

Motivation Allgemeines Bis jetzt: Alle Elemente und Methoden einer Klasse/Struktur an Instanz gebunden: struct Foo { int x; int bar() { return x; } int main() { Foo f; f.x = 0; // Okay!! f.bar(); // Okay!! } Foo::x = 0; // Fehler!! Foo::bar(); // Fehler Christof Elbrechter Praxisorientierte Einführung in C++ May 28, 2014 3 / 11

Allgemeines static Manchmal werden aber klassenspezische Daten/Methoden benötigt Beispiele: Performancemessungen (Anzahl der Methodenaufrufe mitzählen, usw.) Methoden, die Instanzen erstellen (Singleton Pattern, Factory Pattern, usw.) In Klassen/Strukturen kann Schlüsselword static benutzt werden Christof Elbrechter Praxisorientierte Einführung in C++ May 28, 2014 4 / 11

Allgemeines Beispiel static-beispiel class Foo { static int s instancecount; public: Foo() { ++ s instancecount; } Foo() { s instancecount; } static int getinstancecount() {return s instancecount; } Frage: Wo wird s_instancecount initialisiert? Wenn const: u.u. direkt im Header Wenn nicht: In einer Quellcode-Datei Sonst wird die One-Denition-Rule verletzt Christof Elbrechter Praxisorientierte Einführung in C++ May 28, 2014 5 / 11

Beispiel - Initialisierung Allgemeines foo.h class Foo { /// direkt im header (nur in wenigen Faellen: s.u.) const static int classid = 100; static int s instancecount; // s prefix wegen s tatic public: Foo(); Foo(); static int getinstancecount (){...} foo.cpp /// so wird das richtige Symbol erzeugt und initialisiert int Foo:: s instancecount = 0; Christof Elbrechter Praxisorientierte Einführung in C++ May 28, 2014 6 / 11

Allgemeines Wann darf ein static Member direkt initialisiert werden? class Foo{ static const int BAR = 5; Direkte Initialisierung nur in speziellen Spezialfällen... für konstante Ganzzahltypen oder Aufzählungstypen... wenn Initialisierungsausdruck auch konstanter Ganzzahlausdruck Dann darf der Typ aber immer noch nur in konstanten Ganzzahlausdrücken vorkommen Das geht dann sehr stark ins Detail Christof Elbrechter Praxisorientierte Einführung in C++ May 28, 2014 7 / 11

Allgemeines Wann darf ein static Member direkt initialisiert werden? class Foo{ static const int BAR = 5; Direkte Initialisierung nur in speziellen Spezialfällen... für konstante Ganzzahltypen oder Aufzählungstypen... wenn Initialisierungsausdruck auch konstanter Ganzzahlausdruck Dann darf der Typ aber immer noch nur in konstanten Ganzzahlausdrücken vorkommen Das geht dann sehr stark ins Detail Ausweg: einfach immer auÿerhalb der Klassendenition in einem.cpp File deklarieren Christof Elbrechter Praxisorientierte Einführung in C++ May 28, 2014 7 / 11

Singleton Singletons (auch singelton pattern) Manchmal braucht man eine Klasse, von der es maximal eine Instanz gibt Instanz sollte global erreichbar sein Beispiele: Klasse, die Kongurationsle repräsentiert Hauptfenster einer Applikation... Lösung: Singleton Christof Elbrechter Praxisorientierte Einführung in C++ May 28, 2014 8 / 11

Implementation jedoch fragwürdig: wer gibt s_instance frei? Christof Elbrechter Praxisorientierte Einführung in C++ May 28, 2014 9 / 11 Universität Bielefeld Neuroinformatics Group, CITEC Singleton - Beispiel Singleton foo.h class Foo { static Foo s instance; Foo(); // privater Konstruktor > Instanzierung verboten public: static Foo getinstance(); Foo(); foo.cpp #include " foo.h" Foo Foo:: s instance = 0; Foo::Foo() { } Foo:: Foo() { s instance = 0; } Foo Foo:: getinstance() { if ( s instance == 0) s instance = new Foo; return s instance; }

Alternative Version Singleton // foo.h class Foo { Foo(){ // privater Konstruktor > Instanzierung verboten public: static Foo getinstance(); // foo.cpp #include " foo.h" Foo Foo:: getinstance() { static Foo instance; return &instance; } // instance wird automatisch bei Programm // ende zerstoert Achtung: auch diese Implementation kann zu Problem führen Es ist nicht direkt klar, in welcher Reihenfolge lokale static Variablen freigegeben werden Ausweg: sog. Smart-Pointer verwenden Genaugenommen geht das schon mit den herkömmlichen C++ auto_ptr<t> aus dem header <memory> Christof Elbrechter Praxisorientierte Einführung in C++ May 28, 2014 10 / 11

static Methoden - Anmerkung Singleton Es ist auch möglich static Methoden über Objektnamen aufzurufen #include <iostream> struct X { static void f() { std::cout << "X" << std::endl; } int main() { X x; x.f(); } Christof Elbrechter Praxisorientierte Einführung in C++ May 28, 2014 11 / 11