|
| Författare | Meddelande |
|---|
Johan
Antal inlägg: 47 Join date: 08-09-03
 | Rubrik: Uppg 5 - Polymorfism ons okt 01, 2008 1:17 am | |
| Här kommer mitt exempel för hur uppgift nr. 5 kan se ut. Polymorfism är det viktiga här. Så se till att ni studerar speciellt det där med abstrakta klasser med virituella metoder och hur man kan använda detta polymorfiskt med pekare. Sedan har jag även vävt in en repetition av länkad lista här. Det kommer att underlätta för er sen i nästa uppgift när vi ska skriva en köapplikation. Som vanligt vill jag inte att ni bara kopierar min kod rakt upp och ned. Försök sätta er in i koden och förstå hur den är uppbyggd. Inlämningar som ser ruskigt likt min kod ut kommer att behöva extra genomgång muntligt. Jag tipsar också igen om att plocka in min kod i ett annat program som kan highlighta koden bättre. (tex. notepad++ eller CodeBlocks) Lycka till! .. inga medvetna fel är inlaggda denna gång.. men om ni hittar fel, tveka inte att rapportera om det. |
|
 | |
Johan
Antal inlägg: 47 Join date: 08-09-03
 | Rubrik: Re: Uppg 5 - Polymorfism ons okt 01, 2008 1:18 am | |
| Jag använder mig av min gammla globals.h igen mest för att den käns som att den håller på att bli standard.  Använder iof nästan inte dice() .. men på ett ställe.. | Kod: | //globals.h //----------
//ifndef och define gör det lättare att kompilera projektet om man har fler includes av denna fil #ifndef GLOBALS_H_INCLUDED #define GLOBALS_H_INCLUDED
//Includes #include <time.h>
//Om man skapar en onämnd namespace såhär, så kan man använda globala funktioner i alla andra filer som inkluderar "globals.h" namespace{
//Tärningsfunktionen. Returnerar en framslumpad siffra mellan min- och max-värdet. int dice(int min, int max){ int diceVal = rand() % (max - min +1) + min; return diceVal; } }
#endif //#ifndef GLOBALS_H_INCLUDED
|
|
|
 | |
Johan
Antal inlägg: 47 Join date: 08-09-03
 | Rubrik: Re: Uppg 5 - Polymorfism ons okt 01, 2008 1:19 am | |
| | Kod: | //Item.h //----------- #pragma once //Ser till att h-filen bara blir inkluderad en gång.
//Includes #include <iostream> #include <conio.h> #include <string>
//Namespace using namespace std;
//Den abstrakta klassen Item. Förälderklass till Weapon och Key. //Eftersom klassen har virituella metoder i sig, kallas klassen för "abstrakt" klass. class Item{ protected: string name; //Namn på Item:et Item* next; //Länk till nästa objekt i listan. public: ~Item(); //Destruktor (körs när objektet deletas). Se nedan. Item* getNext(){return this->next;} //Typisk get-metod void append(Item* soonToBeLastObject); //Lägg till ny sak i listan void virtual print(void) =0; //Virituell metod. Måste specifieras i barnklasserna. };
//Destruktor. Körs när objketet deletas. //Eftersom vi har en länkad lista och allokerar minne dynamiskt så måste vi rensa upp minnet efter oss. //Här kör vi altså delete på objektets next; //Så att: objektet deletar sin nästa, som deletar sin nästa, som deletar sin nästa osv... Item::~Item(){ cout << "\nDeleting " << name;
//Kontrollera att next inte är NULL if (this->next){ //Om det finns en next: Ta bort den. delete this->next; }else{ //Om det inte finns så är vi längst bak i listan. cout << "\nEnd of list."; } }
//Lägger till ett till Item i listan. Får Item:et med sig som argument. void Item::append(Item* soonToBeLastObject){ //Kontrollera att this->next inte är NULL if (this->next){ //Om next inte är NULL:kolla vidare i listan. this->next->append(soonToBeLastObject); //Rekursivt funktionsanrop. :) //Den kör sigsjälv på objektets next. //Alltså: this kör append() på sin next, som kör append() på sin next, som kör append på sin next osv... ända till vi kommit längst bak i listan. }else{ //Om next är NULL: Så är vi längst bak i listan. this->next = soonToBeLastObject; //Lägg till det nya objektet i next. } }
|
Senast ändrad av Johan den ons okt 01, 2008 1:32 am, ändrad totalt 1 gång |
|
 | |
Johan
Antal inlägg: 47 Join date: 08-09-03
 | Rubrik: Re: Uppg 5 - Polymorfism ons okt 01, 2008 1:20 am | |
| | Kod: | //Weapon.h //----------- #pragma once //Ser till att h-filen bara blir inkluderad en gång.
//Includes #include <iostream> #include <conio.h> #include <string>
//Egna includes #include "Item.h" #include "globals.h"
//Namespace using namespace std;
//Klassen Weapon. Barnklass till klassen Item. Weapon "är" alltså ett Item. class Weapon: public Item{ private: int minDam; //Minimum skada int maxDam; //Maximum skada public: Weapon(string name, int min, int max); //Konstruktor. Tar tre parametrar. int getDam(); //Get-funktion för skada; void print(); //Skriver ut vapnet på skärmen. };
//Konstruktor(Körs när objektet skapas). //Tar med sig tre parametrar: namn, minimumskada och maximumskada. Weapon::Weapon(string name, int min, int max){ this->name = name; this->minDam = min; this->maxDam = max; this->next = NULL; //Sätter next till NULL eftersom detta nyskapade objekt kommer att hamna sist i listan. }
//Get-funktion. //Slumpar ut ett tal mellan minDam och maxDam och returnerar värdet. int Weapon::getDam(){ int damage = dice(this->minDam,this->maxDam); return damage; }
//Skriver ut vapnets värden på skärmen. //Specifiering(förtydligande eller färdigställande) av Item:s "virituella" metod print(). void Weapon::print(){ cout << "Weapon( name: \"" << this->name << "\", dam: " << this->minDam << "-" << this->maxDam <<" )"; }
|
|
|
 | |
Johan
Antal inlägg: 47 Join date: 08-09-03
 | Rubrik: Re: Uppg 5 - Polymorfism ons okt 01, 2008 1:21 am | |
| | Kod: | //Key.h //----------- #pragma once //Ser till att h-filen bara blir inkluderad en gång.
//Includes #include <iostream> #include <conio.h> #include <string>
//Egna includes #include "Item.h" #include "globals.h"
//Namespace using namespace std;
//Klassen Key. Barnklass till klassen Item. Key "är" alltså ett Item. class Key: public Item{ private: int door; //Nummer till vilken dörr som nyckeln går till. public: Key(string name, int door); //Konstruktor. Tar två parametrar. int getDoor(); //Get-funktion för dörr; void print(); //Skriver ut nyckeln på skärmen. };
//Konstruktor(Körs när objektet skapas). //Tar med sig två parametrar: namn och dörrnummer. Key::Key(string name, int door){ this->name = name; this->door = door; this->next = NULL; //Sätter next till NULL eftersom detta nyskapade objekt kommer att hamna sist i listan. }
//Typisk get-funktion. int Key::getDoor(){ return door; }
//Skriver ut nyckelns värden på skärmen. //Specifiering(förtydligande eller färdigställande) av Item:s "virituella" metod print(). void Key::print(){ cout << "Key( name: \"" << this->name << "\", leads to door nr: " << this->door <<" )"; }
|
Senast ändrad av Johan den ons okt 01, 2008 1:26 am, ändrad totalt 1 gång |
|
 | |
Johan
Antal inlägg: 47 Join date: 08-09-03
 | Rubrik: Re: Uppg 5 - Polymorfism ons okt 01, 2008 1:22 am | |
| | Kod: | //main.cpp //-----------
//Includes #include <iostream> #include <conio.h> #include <string> #include <time.h>
//Egna includes #include "Item.h" #include "Weapon.h" #include "Key.h"
//Namespace using namespace std;
////////// // MAIN // ////////// int main(){
srand((unsigned)time(NULL)); //Hämta seed från klockan så att dice() funkar som den ska.
Item* inventory = new Weapon("Great Axe",5,10); //Skapar första objeket i listan. //Lägg till några fler vapen i listan med append-metoden. Notera att jag kör new Weapon direkt som argument. inventory->append(new Weapon("Semi Cool Fungus",6,8)); inventory->append(new Weapon("Heavy Metal Guitarr",10,30)); //Lägg till några nycklar med samma append-metod fast nyckelns egen konstruktor. inventory->append(new Key("Golden Key",4)); inventory->append(new Key("Tiny Key",13));
//Jag mixar upp det lite till, bara för att visa på att våran lista innehåller både nycklar och vapen. inventory->append(new Weapon("Superfly Bazooka",100,300)); inventory->append(new Key("Shining Silver Key",36)); inventory->append(new Weapon("Chainsword",20,25)); inventory->append(new Key("Slimy and smelly Skeleton Key",666));
Item* marker = inventory; //En Item-pekare får bli till markör. Så att vi ska kunna loopa igenom listan och skriva ut objekten. while(marker){ //Loopa sålänge markörens värde inte är NULL. Alltså tills vi kommit till slutet av listan. marker->print(); //Skriv ut markerat objekt i listan. cout << endl; //Gör ny rad. marker = marker->getNext(); //Flytta markören till nästa objekt i listan. }
delete inventory; //Ta bort första objektet i listan. Vilket kommer sätta igång en process som tar bort alla objekt i listan. _getch(); return 0; }
|
|
|
 | |
mjaoo
Antal inlägg: 27 Join date: 08-09-06 Ort: Mjau?
 | Rubrik: Re: Uppg 5 - Polymorfism ons okt 01, 2008 7:06 pm | |
| People NI MÅSTE definiera printfunktionen det felet fick jag 24/7. Om ni inte defar den i de andra klasser så kan den tydligen inte hitta klassen. Det har jag lärt mig idag. |
|
 | |
mjaoo
Antal inlägg: 27 Join date: 08-09-06 Ort: Mjau?
 | Rubrik: Re: Uppg 5 - Polymorfism sön okt 05, 2008 11:21 pm | |
| NOTE : om ni ska skriva ut objektet ni precis lagt till skriv: cout << LatObj->name <<endl; Fel många gör. |
|
 | |
|