Avatar billede ahara Nybegynder
22. august 2006 - 22:21 Der er 15 kommentarer og
1 løsning

Organisering af cpp og header filer

Er lige gået igang med c++ igen men kan ikke helt huske måder hvorpå man strukturere sine header og cpp filer på.

Kan nogen hjælpe mig med en kort skitsering?

Tak
AHR
Avatar billede bertelbrander Praktikant
22. august 2006 - 22:32 #1
Header filer indeholder normalt:
enum og class og struct og andre typer.
Prototyper på funktioner (mest i C).
extern eklæring af variable.
templates
inline member funktioner.
#define's

c og cpp filer indeholder:
Kode
Variable
De elementer fra listen over indhold af header filer der kun har relevans for en enkelt c eller cpp fil.
Avatar billede ahara Nybegynder
22. august 2006 - 22:43 #2
Er det sådanne:

//test.h
class Test
{
private:
int temp;
public:
Test();
getEtEllerAndet();
};

//test.cpp
Test::getEtEllerAndet()
{
return temp;
}

//main.cpp
int main()
{
Test *myTest = new Test();
return 0;
}
Avatar billede bertelbrander Praktikant
22. august 2006 - 22:51 #3
Det er en meget almindelig måde at gøre det på.

Husk at test.cpp og main.cpp skal inkludere test.h

Så længe koden er lille, dvs. under ca 1000 linier og ikke skal bruges i flere projecter er det måske lettere at holde det hele i én .cpp fil.
Avatar billede ahara Nybegynder
22. august 2006 - 23:04 #4
Får fejlen:

'Test' : is not a class or namespace name

'Temp' : undeclared identifier

Har du en ide til hvad jeg skal gøre. Virker bl.a. som om jeg ikke kan tilgå variablen temp
Avatar billede bertelbrander Praktikant
22. august 2006 - 23:09 #5
test.cpp skal se sådan ud:
#include "test.h"

Test::Test()
{
}

int Test::getEtEllerAndet()
{
return temp;
}

Og du skal #include "test.h" i main.cpp
Avatar billede nlf Nybegynder
23. august 2006 - 00:03 #6
Funktioner, der kun get/set'er kan desuden med fordel inlines, dvs. give compileren et tip om, at funktionskaldet kan undværes og indsætte funktionskoden i stedet (men uanset hvad bestemmer stadig compileren selv i sidste ende, om funktionen skal inlines eller ej - derfor er dette kun et tip fra programmøren).
Inlined funktioner placeres i h/hpp filen.

Enten:

class Test
{
inline int getEtEllerAndet()
{
return temp;
}
};

Eller:

class Test
{
int getEtEllerAndet();
};

inline int Test::getEtEllerAndet()
{
return temp;
}
Avatar billede mollevp Nybegynder
23. august 2006 - 09:58 #7
Jeg kan huske at denne side har en god beskrivelse:
http://www.eventhelix.com/RealtimeMantra/HeaderFileIncludePatterns.htm
Avatar billede ahara Nybegynder
23. august 2006 - 15:13 #8
Får denne fejl:

Test.cpp(11): fatal error C1010: unexpected end of file while looking for precompiled header directive

//Test.h filen
#ifndef _Test_H
#define _Test_H

class Test
{
private:
    int temp;
public:
    Test();
    int getTemp();
};

#endif

//Test.cpp filen
#include "Test.h"

Test::Test()
{}

int Test::getTemp()
{return temp;}

//Main filen
#include "stdafx.h"
#include "Test.h"

int _tmain(int argc, _TCHAR* argv[])
{return 0;}

Nogen ideer til hvad jeg har gjort galt.

Tak
AHR
Avatar billede arne_v Ekspert
23. august 2006 - 15:33 #9
lyder som stdafx.h mangler
Avatar billede mollevp Nybegynder
23. august 2006 - 16:09 #10
Du bør ikke bruge _ eller __ på dine include guards:

_ = "Each name that ... begins with an underscore followed by an uppercase letter is reserved to the implementation for any use. ... Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace." (17.4.3.1.2/1) Don't use such identifiers.

__ = "Each name that contains a double underscore (_ _) ... is reserved to the implementation for any use." (17.4.3.1.2/1) Don't use such identifiers.
Avatar billede bertelbrander Praktikant
23. august 2006 - 20:16 #11
En bedre løsning var nok at holde dig til C++.
Dvs. slå "precompiled headers" fra og bruge main og ikke _tmain.
Avatar billede arne_v Ekspert
24. august 2006 - 04:04 #12
rigtigt Win32 programmering bruger T hvad som helst
Avatar billede ahara Nybegynder
29. august 2006 - 20:57 #13
Har ikke lukket denne tråd endnu fordi jeg stadig har et par problemer. Hvis jeg f.eks. har en main-fil, en test.cpp/test.h og en test1.cpp/test1.h og ønsker at oprette et test1 objekt med et test objekt "associering", så får jeg følgende fejl:

error LNK2005: "public: __thiscall Node::Node(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??0Node@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) already defined in test.obj

Jeg benytter:

#ifndef
#define

Min kode

#endif

i begge h-filer, men det virker som om at det er her fejlen alligevel ligger da fejl meddelelsen "der er flere af samme fejl" refererer til at flere ting allerede er defineret.

Håber i har tid til lidt mere hjælp

Tak
AHR
Avatar billede ahara Nybegynder
29. august 2006 - 23:37 #14
Min fejl. Har inkluderet en cpp fil og ikke h. Et svar og der er point
Avatar billede mollevp Nybegynder
29. august 2006 - 23:39 #15
svar
Avatar billede mollevp Nybegynder
30. august 2006 - 16:45 #16
svar even
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