Fryshuset Gamer Forum
Vill du reagera på det här meddelandet? Registrera dig för forumet med några klick eller logga in för att fortsätta.


Fryshuset Forum
 
HemHem  Latest imagesLatest images  SökSök  Bli medlemBli medlem  Logga inLogga in  

 

 Uppg 5 - Polymorfism

Gå ner 
2 posters
FörfattareMeddelande
Johan




Antal inlägg : 47
Registreringsdatum : 08-09-03

Uppg 5 - Polymorfism Empty
InläggRubrik: Uppg 5 - Polymorfism   Uppg 5 - Polymorfism I_icon_minitimeons okt 01, 2008 2: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.
Till överst på sidan Gå ner
http://www.cplusplus.com/doc/tutorial/
Johan




Antal inlägg : 47
Registreringsdatum : 08-09-03

Uppg 5 - Polymorfism Empty
InläggRubrik: Sv: Uppg 5 - Polymorfism   Uppg 5 - Polymorfism I_icon_minitimeons okt 01, 2008 2: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. Smile Använder iof nästan inte dice() .. men på ett ställe..
Kod:

http://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
Till överst på sidan Gå ner
http://www.cplusplus.com/doc/tutorial/
Johan




Antal inlägg : 47
Registreringsdatum : 08-09-03

Uppg 5 - Polymorfism Empty
InläggRubrik: Sv: Uppg 5 - Polymorfism   Uppg 5 - Polymorfism I_icon_minitimeons okt 01, 2008 2:19 am

Kod:

http://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 2:32 am, ändrad totalt 1 gång
Till överst på sidan Gå ner
http://www.cplusplus.com/doc/tutorial/
Johan




Antal inlägg : 47
Registreringsdatum : 08-09-03

Uppg 5 - Polymorfism Empty
InläggRubrik: Sv: Uppg 5 - Polymorfism   Uppg 5 - Polymorfism I_icon_minitimeons okt 01, 2008 2:20 am

Kod:

http://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 <<" )";
}
Till överst på sidan Gå ner
http://www.cplusplus.com/doc/tutorial/
Johan




Antal inlägg : 47
Registreringsdatum : 08-09-03

Uppg 5 - Polymorfism Empty
InläggRubrik: Sv: Uppg 5 - Polymorfism   Uppg 5 - Polymorfism I_icon_minitimeons okt 01, 2008 2:21 am

Kod:

http://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 2:26 am, ändrad totalt 1 gång
Till överst på sidan Gå ner
http://www.cplusplus.com/doc/tutorial/
Johan




Antal inlägg : 47
Registreringsdatum : 08-09-03

Uppg 5 - Polymorfism Empty
InläggRubrik: Sv: Uppg 5 - Polymorfism   Uppg 5 - Polymorfism I_icon_minitimeons okt 01, 2008 2:22 am

Kod:

http://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;
}
Till överst på sidan Gå ner
http://www.cplusplus.com/doc/tutorial/
mjaoo




Antal inlägg : 27
Registreringsdatum : 08-09-06
Ort : Mjau?

Uppg 5 - Polymorfism Empty
InläggRubrik: Sv: Uppg 5 - Polymorfism   Uppg 5 - Polymorfism I_icon_minitimeons okt 01, 2008 8: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.
Till överst på sidan Gå ner
mjaoo




Antal inlägg : 27
Registreringsdatum : 08-09-06
Ort : Mjau?

Uppg 5 - Polymorfism Empty
InläggRubrik: Sv: Uppg 5 - Polymorfism   Uppg 5 - Polymorfism I_icon_minitimemån okt 06, 2008 12:21 am

NOTE : om ni ska skriva ut objektet ni precis lagt till skriv:

cout << LatObj->name <<endl;
Fel många gör.
Till överst på sidan Gå ner
Sponsored content





Uppg 5 - Polymorfism Empty
InläggRubrik: Sv: Uppg 5 - Polymorfism   Uppg 5 - Polymorfism I_icon_minitime

Till överst på sidan Gå ner
 
Uppg 5 - Polymorfism
Till överst på sidan 
Sida 1 av 1
 Liknande ämnen
-
» Uppg 7 - Pong

Behörigheter i detta forum:Du kan inte svara på inlägg i det här forumet
Fryshuset Gamer Forum :: Programmering :: Koder-
Hoppa till: