Klasser fra bunden...

Tags:    c++
Skrevet af Bruger #4683 @ 02.02.2004
Da klasser er en vigtig del OOP, vil jeg her give en kort introduktion til emnet. Før jeg går i gang vil jeg lige fortælle hvad en klasse er.
En klasse er en del af din kode, som når den kaldes vil skabe et objekt.
Et eksempel på en simpel klasse er:

Fold kodeboks ind/udKode 

Her laves en klasse "Test" som indeholder en enkelt funktion "Tal" der ikke returnere en værdi. I main oprettes "pTest" som en pointer til Test, det er vigtigt at initiere pointeren til 0 da det ellers vil kunne skabe uforudsete problemer. I linien efter oprettes pointeren "pTest" til objektet Test.
Når du senere kalder "Tal()" via pointeren vil programmet skrive "Hej med dig...".

I det næste eksempel tilføjer vi en constructor til klassen.

Fold kodeboks ind/udKode 


Constructoren har samme navn som klassen, og den kaldes HVER gang der dannes et objekt. Constructorer er MEGET anvendte, og er meget anvendelige til at oprette nogle start betingelser for objektet. Det kunne f.eks. være at du vil lave en klasse "bil" hvor farven skal sættes til "blå" som startværdi.

En anden vigtig del af OOP er destructors:

Fold kodeboks ind/udKode 


I eksemplet herover er der tilføjet en destructor til klassen. Destructoren skal have samme navn som klasse, men med et "~" foran. Destructorer bruges som regel til at "rydde op" efter objektet. Destructoren kaldes når "delete pTest;" eksikveres.

At klasser kan arve noget fra hinanden er også en vigtig del af OOP. Det fungerer ligesom det lyder.. Klasser arver egenskaber fra andre klasser.
Et eksempel:

Fold kodeboks ind/udKode 

Her vil programmet skrive:

Jeg er et menneske...
Jeg er en mand...
Mand destructor...
Menneske destructor...

Det giver jo meget godt mening.
Det der sker er at du laver en klasse "Menneske", hvori der er en constructor og en destructor. Derefter opretter du en klasse "Mand" som du med : public Menneske tildeler alle metoder i Menneske.
I klassen Mand findes, som i Menneske, en constructor og en destructor.
I main opretter du med de to første linier en pointer til et Mand objekt. Idet du skriver new Mand kaldes først base klassens constructor (Menneske) og derefter Mand constructoren.
Ved at skrive delete pMand bliver Mand destructoren kaldt, og derefter base klassens destructor. Det er vigtigt at forstå at base klassen, i dette tilfælde Menneske, ikke arver noget fra underklasse(r).

Nogle gange ønsker man at have en slags "default" metode i base klassen, som kaldes hvis metoden ikke findes i arvklassen. F.eks. skal et menneske måske tale civiliceret, men hvis det er en mand, tale grimt. Et eksempel:

Fold kodeboks ind/udKode 

Her vil programmet skrive:


Jeg er et menneske...
Jeg er en mand...
Jeg taler grimt...
Mand destructor...
Menneske destructor...

Som man se på programmets output bliver tal() i Menneske ikke kaldt. Det skyldes at den overrides af tal() i arvklassen. Ellers er der ikke det nye her.
For at vise at man også kan kalde metoder i base klasse gennem en arvklasse-pointer kommer følgende eksempel:

Fold kodeboks ind/udKode 


Her vil programmet skrive:

Jeg er et menneske...
Jeg er en mand...
Jeg taler grimt...
Jeg er 21 ar gammel...
Mand destructor...
Menneske destructor...

Som man kan se kaldes metoden SetAge(age), og Age sættes til 21. Metoden GetAge() kaldes også, og den returnere Age.

Det var alt for denne gang... I næste afsnit gennemgår jeg bla. Virtuelle metoder.



Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (21)

User
Bruger #2730 @ 03.02.04 08:07
Jeg synes artiklen mangler mange elementer omhandlende klasser. Da klasser i OOP er selvstændige entiteter vil det altid være reæevant at lave attributter på klasser, dette er slet ikke gennemgået i dette eksempel. Det giver ikke meget mening at have en klasse der indeholder nogle funktioner jeg lige så godt kunne have i en anden fil. Synes samtidig du går for hurtigt hen over klasser, destructorer, constructors og alt andet. Men helt klart så er manglen på attributter en alvorlig brist i denne artikel og et af grundlagene for OOP.
User
Bruger #5160 @ 03.02.04 10:11
Ganske go artikel.
Hvad med en artikel om OOP for begyndere? jeg mener sådan lidt nede fra bunden af?
At dømme ud fra den du har skrevet her så er det da sådan en som dig der bør skrive den.
Eller en anden af jer superprogrammører der er her inde! Hører i mig?!!! ;o)
Super artikel igen!!
User
Bruger #4683 @ 03.02.04 17:43
Min artikel er en INTRODUKTION til OOP, derfor giver det jo ingen mening, at tage alle aspekter med. Jeg skrev artiklen for at give et indblik i hvad OOP er. Håber da ikke at Brian H. er sur :-)
User
Bruger #2730 @ 03.02.04 21:56
Jeg er da ikke sur :-) Min holdning er bare at hvis man skal lve en artikel omhandlende OOP, så skal man have de vigtigste aspekter med. De ting jeg nævner er i denne sammenhæng MEGET vigtige, og OOP giver ikke mening uden dem. Derfor dette lille øf. Hvis ikke der er attributter på en klasse så behøver jeg vel egentligt ikke en klasse og et objekt, men blot en fil med funktioner
User
Bruger #4683 @ 03.02.04 22:02
Det er korrekt, men det ville blive problematisk at demonstrere arv, constructor og destructor i en fil med funktioner. Desuden synes jeg at artiklen giver godt indbilk i hvordan en simpel classe oprettem som hvordan forskellige dele af den kaldes... :-)
User
Bruger #4841 @ 04.02.04 09:15
Som introducerende artikel synes jeg det er lidt uheldigt udelukkende at bruge heap'en til instansiering af variable - man kunne få det indtryk at det er det eneste rigtige.
Man bør som udgangspunkt altid bruge stakken - med mindre man nødvendigvis skal have et dynamiskt objekt. Dit første eksempel understreget dette til fulde da det leaker! I stedet burde main() se nogenlunde således ud:
Test test;
test.Tal();
return 0;
User
Bruger #2695 @ 06.02.04 10:44
Du har lavet en fejl. Du glemmer at erklære de metoder, som kan overstyres for 'virtual'. Dvs. at i både Menneske og Mand klasserne skal destructorerne og Tal() metoderne være virtual:
class Menneske
{
//...
virtual ~Menneske() {
//...
}
virtual void Tal() {
//...
};

Ellers er udfaldet udefineret. Nogle compilere ville kalde Menneske's Tal metode og andre ville kalde Mand's Tal metode. Nogle ville endda kalde begge.
User
Bruger #2695 @ 06.02.04 15:51
"Hvis ikke der er attributter på en klasse så behøver jeg vel egentligt ikke en klasse og et objekt, men blot en fil med funktioner"
Ikke korrekt. Ofte giver det MEGET mening at definere et interface som en klasse udelukkende med pure virtual funktioner og intet andet. F.eks. en klasse til at håndtere tastaturtryk:
class KeyboardListener {
public:
virtual void keyDown(char key);
virtual void keyUp(char key);
};
Jeg ved at ovenstående klasse ikke kan tjekke for pile taster og shift, ctrl og alle mulige andre, men den illustrerer at man ofte kunne definere klasser udelukkende med metoder.
User
Bruger #4683 @ 22.02.04 16:42
Jeg skal ikke sige du ikke har forstand på det du udtaler dig om, men OOP omhandler brugen af classer og objekter. Så OOP må da være brugt her. Artiklen viser den grundlæggende syntax ved objekter og klasser.
Jeg har valgt at bruge pointere til classes objekter, da jeg har vænnet mig til det...
Ellers godt med lidt konstruktiv kritik "Luthien"
User
Bruger #2695 @ 23.02.04 09:49
Hmmm....bare fordi man bruger klasser behøver kode ikke at være objekt orienteret. Prøv at tænke lidt over det...objekt orienteret. Orienteret mod brugen af objekter. Det behøver ikke være et sprog som direkte understøtter klasser som C++ gør, man skal bare bruge objekter i høj grad på en fornuftig måde og der mangler du en masse ting. Bl.a. en forklaring om hvad arv og polymorfisme er og hvorfor og hvornår man bruger det og hvornår og hvorfor man IKKE bruger det. Pure virtual metoder blev ikke nævnt. Information hiding blev ikke nævnt og sådan kunne man blive ved. Luthien kunne have været meget mere konstruktiv i sin kritik men jeg er enig i at artiklen ikke beskriver OOP særlig godt.
User
Bruger #4683 @ 23.02.04 19:39
Nu hedder artiklen jo også "klasser fra bunden".. Har vel ikke lovet at skrive om OOP. Skriver bare at klasser er en vigtigt del af OOP?!?
User
Bruger #6336 @ 22.08.04 19:29
øhm, er ny i C og C++...
men når jeg laver det der eksembel starter dos promt, og lukker et split-sekund efter.. jeg når ikke at se hvad der sker. hvorfor lukker dos igen med det samme?
User
Bruger #5910 @ 07.09.04 17:06
Det er fodi programmet afvikler det hele for hurtigt


User
Bruger #2695 @ 15.09.04 18:14
Start en dosprompt og kør programmet derfra.
User
Bruger #65 @ 08.04.05 21:16
Hvad er fordelen / menigen med klasser?
User
Bruger #7553 @ 28.04.05 18:28
Syntes det er en god artikel.
Men kan du sige mig hvorfor den lukker lige efter man har "run" den...
User
Bruger #8431 @ 02.01.06 12:32
fordi at programmet bliver kørt hurtigere end du kan læse prøv at #include<stdlib.h> og indsæt system("PAUSE"); lige før return 0; så burde den sætte dit program på pause
User
Bruger #8856 @ 02.03.06 02:05
Klart under-ratet artikel. Meget god beskrivelse af klasser, selvom det hele måske godt kan forekomme én lidt abstrakt, og anvendelsesmulighederne ikke ligger klare - men det er jo ikke meningen med denne artikel.

Good Job!
User
Bruger #8985 @ 16.04.07 21:22
Luthien > Jeg synes du skal holde dig væk fra dette site i fremtiden, hvis ikke du har noget bedre at komme op med.

JT > Hvorfor opretter du egentlig dine klasser med pointere? Det er nok en smagssag, men jeg plejer at gøre sådan her, hvilket jeg synes er lidt lettere:
Fold kodeboks ind/udKode 

Eneste ulempe er at man (vist?) ikke kan benytte delete i den sammenhæng.
User
Bruger #13288 @ 05.03.08 12:53
Jeg er nybegynder, og synes at det er temmelig
umuligt at adskille de forskellig elementer af
programmering fra hinanden.
I denne artikel var det dog nemt, fordi du har
holdt det simpelt. Jeg ved ikke hvad attributter er,
efter denne artikel, men mon ikke jeg opsnapper
det en anden gang?
venligst hilsen en tilfreds nybegynder.
User
Bruger #13669 @ 04.05.08 16:04
fandt endelig ud af hvad en calss er.

kan nok ikke bruge calsses til så meget med den viden jeg har fået, men jeg har fundet ud af hvad det er :D tak.
Du skal være logget ind for at skrive en kommentar.
t