Avatar billede exp-ralle Nybegynder
10. november 2002 - 10:34 Der er 17 kommentarer og
1 løsning

Hvad er den bedste af disse kodestile?

Hejsa...

Ville bare lige høre hvad i synes der var bedst og om alle 3 dele (kommer lidt nede) er mulige at bruge.

Jeg har en klasse som jeg har tænkt mig at definere i en headerfil.
Jeg har også nogle medlemsfunktionener til den klasse:

1. Er det bedst (og overhovedet lovligt?) at definere sine medlemsfunktionener i den samme header fil som klassen?
2. Er det bedst (og overhovedet lovligt?) at definere sine medlemsfunktionener i en anden header fil?
3. Er det bedst bare at definere dem i sin "hovedfil"?
Avatar billede soreno Praktikant
10. november 2002 - 10:46 #1
Jeg foretrækker at opdele i en headerfil og en implementationsfil. Jeg kan godt lide at kunne nøjes med at se på headerfilen hvordan den skal bruges. Altså, hvilke metoder og datamembers der stilles til rådighed. F.eks.

Bog.h

class Bog
{
  public:
    Bog();
    ~Bog();
    void setTitle(string newTitle);

  protected:
    string title;
};

Bog.cpp
#include "Bog.h"
Bog::Bog()
{
}

Bog::~Bog()
{
}

void Bog::setTitle(string newTitle)
{
  title = newTitle;
}

Der er også situationer hvor det kræves at header og implementering er i samme fil. Det skal man når man laver template klasser.
Avatar billede exp-ralle Nybegynder
10. november 2002 - 10:49 #2
Hmm... mener du så at bog.cpp er hovedfilen og derved punkt 3 eller at bog.cpp også skal indkluderes i fx. hovedfil.cpp og altså er punkt 2?
Avatar billede soreno Praktikant
10. november 2002 - 10:53 #3
jeg kan ikke helt forstå hvad du mener i punkt 2 og 3, men:
.h files skal indeholde alle definitioner af metoder og data members.
.cpp skal indeholde implementeringen af metoderne.
Avatar billede exp-ralle Nybegynder
10. november 2002 - 10:57 #4
Jeg mener sådan her:

Bog.h indholder klassen og erklæring af datamembers og metoder.

Men definationen af metoderne (hedder det ikke det?) altså:

Bog::Bog()
{

}

Står i en anden header fil fx. Metoder.h

Og så inkluderer hovedfilen både Bog.h og Metoder.h (skal den ende på .h eller .cpp så?)

Det er punkt 2.

I punkt 3 har man en header fil Bog.h med klassen og eklæringen af datamembers og metoder.

Men definationen af metoderne ligger i hovedefilen hvor Bog.h også er indkluderet
Avatar billede exp-ralle Nybegynder
10. november 2002 - 10:59 #5
Og i 1'eren er både klassen og metoderne erklæret i én fil.
fx. Bog.h som så indeholder:

class Bog
{
  public:
    Bog();
    ~Bog();
    void setTitle(string newTitle);

  protected:
    string title;
};

Bog::Bog()
{
}

Bog::~Bog()
{
}

void Bog::setTitle(string newTitle)
{
  title = newTitle;
}

I denne ene headerfil.
Avatar billede soreno Praktikant
10. november 2002 - 11:01 #6
Umiddelbart ville jeg så sige 3.
Men kun hvis du mener:
>>Men implementeringen af metoderne ligger i hovedefilen hvor Bog.h også er indkluderet.<<

Altså ligesom mit eksempel ovenfor.
Avatar billede exp-ralle Nybegynder
10. november 2002 - 11:02 #7
Altså så kun klassen ligger i en header fil og ikke definationen af metoderne.

I dit eks. skal der forstås at Bog.cpp er hovedfilen og Bog.h er klassen?
Avatar billede soreno Praktikant
10. november 2002 - 11:04 #8
Bog.h er headerfil
Bog.cpp er implementationsfil
Avatar billede exp-ralle Nybegynder
10. november 2002 - 11:09 #9
Undskyld men jeg er lidt nybegynder - hvad betyder implementationsfil?
Er bog.cpp både der hvor man definerer metoderne og hovedfilen eller kun der hvor man definerer metoderne?
Avatar billede soreno Praktikant
10. november 2002 - 11:14 #10
Ideen er at du adskiller implementeringen af metoder fra definitionen.

Implementeringen er >hvordan< metoder virker, altså hvordan sorterer jeg biblioteket.
Definitionen er >hvad< metoden gør, altså hvilke metoder klassen stiller til rådighed.
Avatar billede exp-ralle Nybegynder
10. november 2002 - 11:15 #11
Hvorfor er det nu lige det er smart at skille dem ad?
Avatar billede soreno Praktikant
10. november 2002 - 11:25 #12
Fordi hvis du får stukket en Bog klasse i hånden og får bud på at bruge den, så behøver du ikke kigge i implementeringen af denne for at se hvordan den skal bruges. Det kan du se udfra metoderne.
Avatar billede exp-ralle Nybegynder
10. november 2002 - 11:30 #13
Og jeg behøver kun vide HVAD metoden gør eller hvad?
Avatar billede soreno Praktikant
10. november 2002 - 11:34 #14
Ja, forestil dig at du skulle benytte f.eks. <stdio.h> for første gang. Så vil du i headerfilen se at der er nogle metoder, men ikke hvordan disse er programmeret. Du vil måske finde printf(..) og synes at "den vil jeg prøve". Så laver du følgende lille eksperiment:

#include <stdio.h>

int main(int argc, char **argv)
{
  printf("Hello world");

  return 0;
}

Så har du lavet et program uden at kende til hvordan printf() faktisk er programmeret.
Avatar billede exp-ralle Nybegynder
10. november 2002 - 11:42 #15
Ok sidst spm:

Hvor ligger informationen om hvordan printf() f.eks. er lavet?
Avatar billede soreno Praktikant
10. november 2002 - 11:49 #16
det gør de i "libcrtdll.a" hvis du bruger MinGW. Det er derfor man linker til diverse libraries..
Avatar billede exp-ralle Nybegynder
10. november 2002 - 12:19 #17
Okay mange tak
Avatar billede soepro Nybegynder
11. november 2002 - 11:05 #18
Det er "bedst" at:

Skrive klassens definition og alle memberfunktioners prototyper i .h filen
Skrive klassens memberfunktioners kode i .cpp filen

Udtagelser hertil er IMHO funktioner der kan skrives på een linie - typisk de simple getters/setters.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester