hvordan skriver i classes?

Tags:    c++

<< < 12 > >>
har tænkt lidt over hvordan i skriver jeres classes.

den måde jeg har gjort det på nu er at jeg har defineret classen, eller hvad man nu kalder det i en .h fil.

så har jeg skrevet det hvor man bestermmer hvad medlems variablerne gør i .cpp filen

eks:

.h fil:
Fold kodeboks ind/udKode 


.cpp fil:
Fold kodeboks ind/udKode 


tror ikke at det er den bedste måde, men har lidt svært ved at forstå hvad den bog jeg læser (c++ grundbog) mener at man skal gøre. Så vil gerne se hvad i gør.



14 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 2 karma
Sorter efter stemmer Sorter efter dato
en klasse gemmes i 2 filer.

klasse.h fil med definitioner
Fold kodeboks ind/udKode 


og en klasse.cpp fil med functions implementationerne
Fold kodeboks ind/udKode 


der kan godt være flere scope blokke af samme scope i en klasse definition, dette er relevant hvis du f.eks. vil
Fold kodeboks ind/udKode 


Og efter min mening skal member variabler altid erklæres private, så du sikker på at andre eller dig selv ikke ødelægger dem totalt i forhold til hvad tanken er med dem.

et eksempel kunne være hvis du havde en klasse der havde en liste af elementer og som blottede størrelses variablen i denne liste:

Fold kodeboks ind/udKode 

ovenstånde er pseudokode, men bør være klart at eftersom man ikke havde putte noget i listen, men sætter counteren til at man har, vil den gå galt når du prøver at indeksere i listen med getItem();



men forstår ikke meningen i at putte variabler i private, også lave acceseor metoder.


Der er ingen mening, det er rent spild af tid. Det er en meget gammel mani blandt nogle OO-nørder, som har misforstået OO. Du vinder intet.

Til Jess; naturligvis er det en god ide at sætte sig ind i grundprincipperne i OO. Men at lave trivielle "accessor metoder" har intet med god OO programmering at gøre og man vinder reelt intet ved at lave "accessor metoder".



Det er jeg ikke enig med dig i. Du har ikke mulighed for at styre adgangen til variablerne hvis de er offentlige på klassen.

Forestil dig at du har en klasse som nedenstående. Det er dog kun et lille tænkt eksempel og ikke alle aspekter omkring sikkerhed er dækket i det.

Fold kodeboks ind/udKode 


Ovenstående vil gøre det muligt for alle umiddelbart at læse og skrive både brugernavn og adgangskode. Vælger du i stedet at bruge accessor metoder, så kan du pludselig begynde at styre adgangen og samtidig adgang til variablerne.

Fold kodeboks ind/udKode 


Herved tvinger du brugeren af klassen til at bruge den logik du har lagt og du beskytter tilgangen til dataene. Er alle medlemsvariable offentlige, så er der ingen grund til at bruge accessor metoderne. Man kan jo rette i dem direkte, så derfor laver man metoderne private.

Ved brug af flere DLL'er er det endvidere MEGET fornuftigt at bruge accessor metoder, da du så kan indkapsle dine allokeringer/deallokeringer i en DLL. Er alle variable public, så kan de blive allokeret fra en vilkårlig DLL, hvilket giver et meget dårligt og igennemskueligt design.







Indlæg senest redigeret d. 19.05.2008 17:20 af Bruger #10448
ok, det er også sådan codeblocks gør det. Hvad gør

#ifndef KLASSE_CPP
#define KLASSE_CPP
og
#endif
??



Husk at beskytte dine data på klassen, så har du nemmere med at styre ting som fx samtidighed. Det er generelt også en god regel at tilgå medlemsvariabler med accessor metoder i stedet for at gøre dem offentlig tilgængelige ved at placere dem under public sektionen. Herudover er det en god ide at have constructor og destructor med på sin klasse.

// HEJ.H fil
#ifndef HEJ_H
#define HEJ_H

class Hej
{
private:
int variabel1; // Medlemsvariabel
int variabel2; // Medlemsvariabel
public:
Hej(); // Constructor
~Hej(); // Destructor

void funktion();

int getVariabel1(); // Accessor metode
int getVariabel2(); // Accessor metode
void setVariabel1(int i); // Accessor metode
void setVariabel2(int i); // Accessor metode
}

#endif

// HEJ.CPP fil
// Indeholder implementationen af dine metoder
// To af metoderne er vist som eksempel her nedenfor

int Hej::getVariabel1()
{
return variabel1;
}

void Hej::funktion()
{

}

// MAIN.CPP fil
#include "HEJ.H"

int main()
{
Hej * pKlasse = new Hej();
pKlasse->funktion();
delete pKlasse;
}


Hth




Indlæg senest redigeret d. 11.05.2008 12:08 af Bruger #10448
Tak for alle svarene, det hjalp rigtig meget.

har fordelt pointne



sådan endelig fik jeg det til at virke....

havde sat nogel flueben nogle steder i code::blocks hvor de ikke skulle være... tror faktisk jeg har arbejdet på det siden jeg skrev forige post lol



Det er imho godt at starte class'en med public members, da det er dem der er vigtigst (for flest), så det gør det lettest at overskue og bruge class'en

Ideen med "accessor metoder" er en af dem mest overvurderede manier i C++ (og andre OO-sprog).



Det er imho godt at starte class'en med public members, da det er dem der er vigtigst (for flest), så det gør det lettest at overskue og bruge class'en

Ideen med "accessor metoder" er en af dem mest overvurderede manier i C++ (og andre OO-sprog).


Men det er stadig en god ide at lære grundprincipperne for OO-programmering fra starten (herunder indkapsling af data, lav kobling og høj samhørighed m.m.). Når man senere sidder med applikationer med 100.000+ liniers kode, så er man glad for at disse principper er på plads og anvendt.





men forstår ikke meningen i at putte variabler i private, også lave acceseor metoder.

Syntes de virker dumt, at vis jeg vil putte input fra en bruger ind i en variable fra en class, bliver jeg nødt til først at putte den ind i en alm. variable først...

det virker ivhært fald ikke særlig smart i de små programmer jeg laver.



<< < 12 > >>
t