===================================== Einfacher Stack: in C++ und im C-Stil ===================================== Einfachheitshalber betrachten wir eine C++ Implementierung für einen Stack mit folgenden Eigenschaften: - Default-Constructor (legt einen leeren Stack an) - Destruktor (räumt einen Stack auf) - Empty-Methode (überprüft, ob der Stack leer ist) - Push-Methode (legt neues Element auf den Stack) - Pop-Methode (entfernt das oberste Element vom Stack) - Print-Methode (gibt den Stack aus) Was offensichtlich für eine richtige Implementierung noch fehlt sind: - Copy-Constructor und Zuweisungsoperator - Constructor für eine R-Value-Referenz Ein einfaches Test-Programm für diese Implementierung sieht zum Beispiel so aus: :import: cpp-lecture/stack-tutorial/example01/cpp/testit.cpp Um genauer verstehen zu können, welche Arbeit der C++-Compiler leistet, vergleichen wir die Stack-Implementierung mit einer Implementierung im C-Stil. Wir benutzen dabei zwar einige C++-Features aber im wesentlichen könnte diese auch in reinem ANSI-C geschrieben sein. Hier sieht das Testprogramm dann so aus: :import: cpp-lecture/stack-tutorial/example01/c-style/testit.cpp Die C++ Implementierung ======================= :import: cpp-lecture/stack-tutorial/example01/cpp/stack.hpp Regeln: Von C++ nach C-Stil ============================ - Aus `class` wird stets `struct` - Aus einem Constructor, einer Methode und dem Destructor werden jeweils Funktionen - Beim Namen der Funktion wird dabei der Name der Klasse als Prefix verpasst. Wir fügen zusätzlich noch einen Unterstrich dazu. Aus der Methode `print` der Klasse `Stack` wird so die Funktion `stack_print`. - Das erste Argument einer dieser Funktionen ist stets ein Zeiger namens `this_` auf das Objekt. Dass hier `this_` statt `this` vereinbart wird ist notwendig, da `this` in C++ ein Schlüsselwort ist. - Innerhalb einer Methode darf der Wert von `this_` nicht verändert werden. Damit soll nachempfunden werden, dass in C++ auch `this` nicht verändert wird. - War die Methode als `const` deklariert, dann wird ist `this_` ein Const-Pointer auf das Objekt. - War eine Methode oder Attribut als `private` deklariert, dann wird bei der Namensgebung ein Unterstrich als Suffix angehängt. Es ist jetzt eine reine Vereinbarung, dass nur innerhalb der Implementierung so gekennzeichnete Funktionen und Attribute verwendet werden dürfen. - Aus geschachtelten Klassen werden eigenständige Klassen. Der Name der ursprünglich übergeordneten Klasse wird wieder als Prefix angefügt. Aus der C++ Klasse `Stack::Element` wird beispielsweise `Stack_Element`. Die C-Stil Implementierung ========================== :import: cpp-lecture/stack-tutorial/example01/c-style/stack.hpp