Classes

Tags:    c++

<< < 12 > >>
jeg forstår ikke rigtig classes...
jeg kan godt forstå hvordan man laver dem osv. men jeg kan ikke forstå hvordan de fungere, og hvad nytte de gør!
kan nogen forklare det for mig, eller give mig et exempel hvor det er nyttigt?

jeg håber i kan hjælpe mig!

PS: et lille side spørgsmål: hvordan får man programmet til at reagere ligeså snart du trykker på en knap, og ikke først efter at du har trykket enter (fx. med "getline(cin, variabel)") jeg skal bruge det til nogen menuer

på forhånd: Tak xD



jeg forstår ikke rigtig classes...
jeg kan godt forstå hvordan man laver dem osv. men jeg kan ikke forstå hvordan de fungere, og hvad nytte de gør!
kan nogen forklare det for mig, eller give mig et exempel hvor det er nyttigt?


hehe...den objekt orienterede tankegang er en svær en at lære, så det kan meget godt være, at der går laaang tid, før du ser lyset.

Klasser bruges til at koble funktioner sammen med de data, som funktionen opererer på. I C ville du måske have følgende sæt af funktioner til at operere på lister:
Fold kodeboks ind/udKode 


Alle funktionerne tager, som første parameter, en pointer til den liste, som funktionen skal operere på. C++ måden at gøre det samme på ville være noget i denne stil:
Fold kodeboks ind/udKode 


Og det er så heller ikke helt rigtigt, for man ville nok også bruge operator overloading og templates. Og så ville man nok bruge en iterator istedet for min foreach metode.
Men funktionerne på klassen defineres SAMMEN med klassen, så hvis du vil vide, hvad du kan bruge List klassen til, så kigger du bare i definitionen af klassen. Det er ikke helt så nemt med mine C funktioner. De kan være spredt ud over et større antal filer og hedde mærkelige ting, så det ikke er helt åbenlyst, at de arbejder med lister.

Arv og polymorfi er andre fordele ved klasser, men som sagt, så kan det være svært at finde ud af, hvorfor klasser er smarte, så prøv bare at bruge dem over det hele, så bliver du klogere hen ad vejen :-)



Indlæg senest redigeret d. 19.05.2008 08:58 af Bruger #2695
så lidt ligesom structs bortset fra at man holder styr på sine funktioner istedet for sine variabler ?

tak for svaret det, kastede lidt mere lys over sagen... tror jeg :S

andre der kan komme med eksempler?





Hej Silas,

Du kan læse alt om klasser her:
http://en.wikipedia.org/wiki/Class_%28computer_science%29

Med venlig hilsen
Ieet




så lidt ligesom structs bortset fra at man holder styr på sine funktioner istedet for sine variabler ?

tak for svaret det, kastede lidt mere lys over sagen... tror jeg :S

andre der kan komme med eksempler?



Opfat dine klasser som fysiske objekter. For eksempel et hus, som har døre vinduer, rum etc.

Fold kodeboks ind/udKode 


Som du ser så er alle data og operationer (på en klasse hedder de metoder) samlet omkring det objekt som de vedrører. Du ved derfor at når du kalder CHouse::openDoor() så åbner du døren på et hus og når du har et hus, så ved du at du har mulighed for at åbne og lukke døren og spørge hvor mange værelser der er i huset.

Ligesom Robert skriver, så er det derfor for at samle de metoder som er relateret til hinanden (og en bestemt type objekt) samt for at beskytte de data som måtte tilhøre huset. For eksempel kan du ikke bare gøre sådan her:

CHouse house;
house.m_bDoorIsOpen = true;

Det skyldes at den variabel er private og du skal derfor bruge CHouse::openDoor() for at åbne døren. Det sætter dig istand til at tilføje noget logik så fx ikke alle kan åbne døren fx ved at tilføje noget sikkerhedslogik i metoden. En meget mere simpel måde (men ikke sikker!) at ændre metoden på kunne også være følgende:

Fold kodeboks ind/udKode 


Metoden kunne også slå op i en LDAP server og se om du er medlem af den gruppe det er krævet for at du må få lov til at åbne døren.

Der er kun dig selv der sætter grænserne. :-)

Hth



Indlæg senest redigeret d. 21.05.2008 21:49 af Bruger #10448
Ieet: skimmede det kun lige men det ser ud som en god look up!

Jess:
det forstod jeg xD sidder og griner (jeg ved ikke hvorfor men jeg griner ofte når jeg fatter noget simpelt, jeg har brugt lang tid på at forstå)
men jeg fatter tilgængeld ikke hvorfor man bruger sådan noget som _m, og T osv. foran mange ting!

og hvad er det helt precis man bruger "void" til?
jeg har set mange det fx. laver deres main med

Fold kodeboks ind/udKode 


isted for

Fold kodeboks ind/udKode 




Klasser er beskrivelsen af et objekt og objekter behøver ikke nødvendigvis være fysiske. En "Rettighed" kan være et objekt. En "Ide" kan være et objekt.
Faktisk er alle navneord kandidater til at blive "klassificeret".



void bruges på steder hvor der skal angives en type, men der ikke er nogen type.

F.eks. for funktioner der ikke returnerer noget:
void Something()
(Det er en fejl at bruge void main())

Eller for funktioner der ikke tager nogen argumenter:
int main(void)
Som i C++ er det samme som:
int main()
(I C er der en lille forskel).

Man kan også bruge void med pointere:
int x;
void *p = &x;
void * kan pege på hvadsomhelst, men de kan ikke derefereres.

Der er en del der godt kan lide at deres identifiers fortæller hvad de identificerer, det kan f.eks. være at man sætter C eller T foran alle class eller typer.
m_xx bruges ofte til members af funktioner.
Og THIS_IS_A_CONST bruges ofte ved "konstanter" (enum værdier, defines og også til tider "rigtige" const'er).
Man er (mange steder) på vej væk fra den tendens, men den findes stadig mange steder.



Ieet: skimmede det kun lige men det ser ud som en god look up!

Jess:
det forstod jeg xD sidder og griner (jeg ved ikke hvorfor men jeg griner ofte når jeg fatter noget simpelt, jeg har brugt lang tid på at forstå)
men jeg fatter tilgængeld ikke hvorfor man bruger sådan noget som _m, og T osv. foran mange ting!



"m_" eller "_m" bruges i forbindelse med prefix eller suffix af variabler. Variabler på en klasse, de hedder medlemsvariable. Disse prefixes ofte med "m_" så man ved det er en medlemsvariabel og fx ikke en variabel der kommer fra et andet (måske globalt?) scope. Ofte sætter man også et bogstav på for at angive typen.

m_iAName Medlemsvariabel som er en int
m_lAName Medlemsvariabel som er en long
m_szAName Medlemsvariabel som er en char
m_pszAName Medlemsvariabel som er en char* (char pointer)
m_pAName Medlemsvariabel som er en pointer
m.fl.

Det er altså blot en navnekonvention man kan vælge at bruge!

"T" bruges ofte i forbindelse med templates, hvor det bogstav vil repræsentere en vilkårlig klasse. Ofte bliver "vilkårlig" dog ofte indsnævret, da man ofte antager at det har nogle givne funktioner.

Nedenstående template funktion sletter eksempelvis indholdet af en liste af std::strenge. I mit eksempel antager jeg altså at typen T er en std::list af std::string*. Dette er også template funktionens preconditions.

Fold kodeboks ind/udKode 



Hth



Indlæg senest redigeret d. 22.05.2008 10:23 af Bruger #10448

Man kan også bruge void med pointere:
int x;
void *p = &x;
void * kan pege på hvadsomhelst, men de kan ikke derefereres.


Supplerende til ovenstående:

& = Address Of
* = Value Of

Når man har altså har en int kaldes x (som ovenfor) så laver man en pointer p som peger på den adresse hvori x findes.

void* kan i øvrigt castes på en usikker måde ved at anvende en reinterpret_cast<>(). Cast'en er usikker da den ikke tager hensyn til hvad der castes fra. Man skal altså vide hvad man har før man anvender den. Modsat så er dynamic_cast<>() mere sikker, da den returnerer NULL hvis ikke polymorfien er overholdt.

Hth



var det meningen at jeg skulle forstå noget af alt det?
jeg tror jeg har brug for en tutorial til classes, og til pointers!
og måske også macros... har godt kunne tænke mig at finde ud af hvordan man bruger dem. har set nogen eksemlper hvor der er lavet nogen ret fede ting med dem!

på forhånd: Tak xD



<< < 12 > >>
t