Bart Hijmans, Universiteit Leiden. Universiteit Leiden The Netherlands
Focus 1 19 ˆ Ervaring in gebruik en implementatie van datastructuren ˆ Kennis van mogelijkheden ˆ Programmeren voor andere programmeurs ˆ Twee nieuwe concepten: ˆ Templates ˆ Inheritance
Template classes 2 19 ˆ Templates worden gebruikt voor functies en datastructuren die op willekeurige datatypen werken. ˆ Kies een type bij instantiatie ˆ Maak een datastructuur 1 keer en het werkt voor alle types
Template Classes: Voorbeeld Klasse 3 19 template <class T> class datastructuur{ void insert(t item); }; template <class T> void datastructuur<t>::insert(t item){...} ˆ T is een naam voor het type van de variabele "item" ˆ Zet bij gebruik van templates de implementatie in de header le!
Template Classes: Voorbeeld Gebruik 4 19 #include <datastructuur.h> void functie(){ datastructuur<int> ds1; ds1.insert(3); } datastructuur<konijn> ds2; konijn Stampertje; ds2.insert(stampertje);
Overerving 5 19 ˆ Overerving of "inheritance" wordt gebruikt om: ˆ Functionaliteit te hergebruiken ˆ Eenheid te creëren tussen classes ˆ Kindclasses nemen memberfuncties en -variabelen over van de ouders, behalve private members ˆ Kinderen kunnen members overschrijven ˆ Naast public en private, nu ook protected members ˆ Protected: Variabele / functie niet bereikbaar van buiten, wél bereikbaar vanuit kinderen
Overerving, Syntax 6 19 class rechthoek{ public: rechthoek(int l, int b) void setlengte(int l); void setbreedte(int b); int getlengte(); int getbreedte(); protected: int lengte, breedte; }; class gekleurderechthoek : public rechthoek { public: gekleurderechthoek(int l, int b, int k); private: int kleur; };
Overerving en templates 7 19 ˆ Kies bij overerving of je de templates wil overerven of alleen voor een speciek datatype template <class T> class ouder{... }; template <class T> class templatedkind : public ouder<t>{... }; class integerkind : public ouder<int>{... };
Netjes Programmeren 8 19 ˆ Korte, herbruikbare en leesbare functies ˆ Eciënte code ˆ Consequent inspringen ˆ Consequente naamgeving voor variabelen ˆ Gebruik geen Nederlands en Engels door elkaar ˆ Overweeg bijvoorbeeld camel case: maaknaamvoorfunctie() ˆ of lage streepjes: maak_naam_voor_functie() ˆ gebruik geen using namespace std; in een.h ˆ Dring je namespace niet op aan de gebruiker ˆ Gebruik std::string, std::cout, std::endl etc.
Files 9 19 ˆ Iedere klasse een eigen header (.h) met klassedenitie ˆ Een andere programmeur ziet alleen de.h! ˆ Iedere klasse een eigen source (.cc of.cpp) met uitwerking ˆ Uitzondering: bij templates mag de uitwerking in de.h ˆ Voor header les, gebruik preprocessor operaties om dubbele denities te voorkomen: #ifndef Bestandsnaam_h #define Bestandsnaam_h // normale code hier #endif
Abstractie 10 19 ˆ private, public en protected functies en variabelen ˆ Public: alleen functies die voor de gebruiker bedoeld zijn ˆ Private: alle variabelen (gebruik public get en set functies) ˆ Private: interne hulpfuncties ˆ Protected is vergelijkbaar met private, maar ook toegankelijk vanuit afgeleide klasses door inheritence. ˆ Zorg dat een gebruiker een datastructuur niet kapot kan maken ˆ Beschermt data en programmeurs ˆ Geef nooit interne pointers terug!
Output 11 19 ˆ Gebruik ostream voor output ˆ Ostream is de ouderklasse van o.a. cout, ofstream en ostringstream ˆ Laat de gebruiker kiezen wat hij er mee doet datastructuur::output(ostream & out){ out << data; } datastructuur ds; ds.output(cout); ofstream outfile("example.txt"); ds.output(outfile);
Commentaar Boven Files 12 19 /** * klassenaam: beschrijving van klasse/programma * @author naam (studentnummer) * @author naam (studentnummer) * @file filenaam * @date datum laatste wijziging **/
Commentaar Boven Functies 13 19 ˆ Boven (member)functiedeclaraties ˆ Programmeurs die een library gebruiken zien alleen de header! class dinges{ public: // commentaar hier! void doeiets(); } // Niet hier! void dinges::doeiets(){ }
Commentaar Boven Functies (2) 14 19 /** * @function functienaam * @abstract beschrijving wat de functie doet, inclusief hulpfuncties. Noem hulpfuncties niet! * @param parameternaam beschrijving rol parameter * @return beschrijving van het resultaat * @pre exacte beschrijving preconditie * @post exacte beschrijving postconditie wat is er veranderd na het uitvoeren van de functie? **/ ˆ Er is niet altijd een pre- of postconditie ˆ Beschrijf wat een functie doet, niet hoe!
Precondities 15 19 ˆ Wat moet er gelden voor een functie kan worden aangeroepen? ˆ Voorbeelden: ˆ De datastructuur mag niet leeg zijn ˆ Er moeten minstens n elementen in de datastructuur zitten ˆ De operator "<" (of "<<" voor output) moet gedenieerd zijn op type T ˆ precondities moeten testbaar zijn!
Const Correctness 16 19 ˆ Laat de programmeur weten welke functies niks veranderen aan de datastructuur en welke parameters zeker niet worden aangepast. ˆ const voor een parameter betekent dat dat parameter niet wordt aangepast ˆ const aan het eind van een functiedeclaratie betekent dat de datastructuur niet wordt aangepast bool zetinlijst(const int & waarde); bool haaluitlijst(const int & plaats, int & waarde); bool isinlijst(const int & waarde) const; ˆ const call-by-reference is ecienter voor grotere datatypes dan call-by-value ˆ static functies kunnen niet const zijn
Const Correctness (2) 17 19 ˆ Let op de verschillen tussen: ˆ int const * p; // p is pointer to const int ˆ int * const p; // p is const pointer to int ˆ int const * const p;//p is const pointer to const int ˆ Lees van rechts naar links ˆ Het is niet in alle gevallen mogelijk alles te verbieden, zorg wel dat je je er aan houdt!
Uitzonderlijke Gevallen 18 19 ˆ Wat gebeurt er als: ˆ een datastructuur vol is? ˆ een datastructuur leeg is? ˆ er een lege string wordt meegegeven? ˆ er een nullpointer wordt meegegeven? ˆ Let op dat postcondities alle gevallen beslaan ˆ Stel eisen aan parameters waar nodig ˆ Return booleans als een operatie kan falen! ˆ Gebruik nooit cout (of cerr) in een memberfunctie voor errors
Standard Template Library datastructuren 19 19 ˆ Bevat veel standaard datastructuren, waaronder vectors, lists, stacks, maps, queues en deques ˆ De interne werking is bijna altijd onbelangrijk. ˆ Toegevoegd als include, bv #include <stack> ˆ Datastructuren zijn templates, ze werken voor elk type data, maar voor maar 1 tegelijk ˆ vector<string> myvector; //een vector met strings ˆ list<int> mylist; //een list met ints