problem med classes, og spørgsmål om headers.

Tags:    c++

<< < 12 > >>
jeg har denne kode:
Fold kodeboks ind/udKode 

først vil jeg lige sige at det er første gang jeg prøver at arbejde med classer, så jeg er ikke sikker på om jeg har forstået det rigtig.

jeg vil gerne kunne oprette et menu punkt med min createMenuItem() funktion, og sætte parametre derekte.
dette kan jeg bare ikke komme til da jeg ikke kan ændre i mnames variabler før den er lavet!
hvordan kan jeg løse dette problem?

og en anden ting:
jeg ved ikke så meget om header filer andet end at man bruger dem til at inkludere nogen libaries, men jeg ville vide om jeg kan putte min class ind i en header fil, og så bruge den i min main kode, hvis header filen er inkluderet? eller er det ikke sådan de fungere?

jeg håber i kan hjælpe mig!
på forhånd: Tak!



Indlæg senest redigeret d. 24.05.2008 09:02 af Bruger #11072
Gik ikke rigtig op for mig hvad mname skulle bruges til, følgende kode har en Menu klasse som tager de 3 argumenter i
constructoren og giver de 2 sidste argumenter til de to member variablers copy constructorer.

main.cpp
Fold kodeboks ind/udKode 


Menu.hpp
Fold kodeboks ind/udKode 


Menu.cpp
Fold kodeboks ind/udKode 




det forstod jeg meget lidt af.
for det første har jeg aldrig set en .hpp fil før (og ved ikke hvordan den laves).
og der er en masse ting jeg ikke rigtig forstår :/

kan du prøve at lave nogen komentare, eller linecomments til koden, hvor du forklare det i "baby sprog"?

Tak!



jeg havde ellers skrevet sådan en lang forklaring... men så så jeg at nørden havde lavet createMenuItem som en constructor, også passede det jeg havde skrevt ikke helt. Her er hvad jeg nåde at skrive, bare glem det vis du bliver forvirret... :(


************************
en .hpp fil er det samme som en .h fil.

så det nørden gør er at han i en .h/.hpp fil (headerfil) laver classen menu. Det samme som du gør her:
Fold kodeboks ind/udKode 


#ifndef MENU_HPP_INCULDED
#define MENU_HPP_INCLUDED
og
#endif

sørger for at man ikke includer samme fil flere gange.

han includer også string for at få lov til at bruge string typen.

alt der ikke står under noget (private, public eller protected) i en class er som standerart under private dvs. at i har de samme tin under prvate. Han skriver std:: foran string da den er en del af namespaced std(standerart). Desuden laver han funktionen getDis, så han kan hente variablen dis.
btw skal du ikke skrive menu:: når du skriver i selve classen.

i menu.cpp includere han menu.hpp.
Menu::Menu(std::string mname, std::string tmpDis, char tmpInp):dis(tmpDis),inp(tmpInp){}

gør det samme som:

menu::createMenuItem(string mname, string tmpDis, char tmpInp){
menu mname; //denne linje skal slettes
mname.dis = tmpDis;
mname.inp = tmpInp;
}

bortset fra at du ikke skal oprette et menu objekt her.

//skal der ikke stå "void menu::crea......"??//

desuden laver han også GetDis funktionen.

i main.cpp includeres menu.cpp
//er det ikke en god ide at includere den under iostream??//
************************






Indlæg senest redigeret d. 24.05.2008 16:32 af Bruger #13669
en hpp fil er bare en ganske almindelig txt fil hvor du bare har skrevet hpp i stedet for txt,

#ifndef MENU_HPP_INCLUDED<-- ved linier som denne her en if sætning på om macroen MENU_HPP_INCLUDED er defineret som testes af compileren.

#define MENU_HPP_INCLUDED<--ved disse linier defineres en macro, i dette tilælde kaldet MENU_HPP_INCLUDED

#endif afslutter en if som f.eks #ifndef

construktionen
#ifndef A
#define A
...code...
#endif
i en fil kaldes en include guard og gør at filen kan includeres flere gange i koden ud at der kommer redefine errors

definitionen til Menu klassen er lagr i hpp filen Menu.hpp, lig mærke til at functionerne ingen body har, implementationerne af functionerne er så i Menu.cpp filen.

I en klasse er functioner af samme navn som klassen constructore og kaldes når en instans af klassen laves
Menu menu("start","test", 'a');
laver en instans af klassen i variablen menu, og kalder klassens constructor,
Menu::Menu(std::string mname, std::string tmpDis, char tmpInp):dis(tmpDis),inp(tmpInp){}
som du kan se har jeg ":dis(tmpDis),inp(tmpInp)" efter ) og før {, dette kaldes en initialiseringsliste den kan bruges til at sætte en klasses member variabler før klassen bliver konstrueret, fordelen ved dette er at du ikke først construer membervariablerne med en eller anden default værdi for lige derefter at overskrive denne værdi med en ny.

Menu:: i cpp filen betyder at functionen tilhører Menu klassen, så Menu::Menu er altså Menu functionen(constructoren) til Menu klassen.

Dog for at forvirrer dig og alle andre betyder std:: ikke at det tilhører en klasse kaldet std, men derimod namespaces std, man kan komme uden om at skulle skrive std:: ved at skrive using namespace std i toppen af sin filer, dog ødelægger det hele pointen i namespaces så lad være med at gøre det.

Der en en Begynder guide under artikler som jeg antager forklare alt det jeg lige har sagt.





jeg tror jeg springer over, og laver noget mere simpelt :S
jeg så på et tidspunkt nogen lave et menusystem på denne måde (eller ihvertfald tæt på) og da det hele blev sat sammen var det skide smart!
da jeg lige havde læst lidt om klasser ville jeg entlig bare se om jeg kunne gøre det samme uden at skrive efter :/

men eeh... næ!

ellers mange tak for hjælpen



jeg er ikke specielt god til c++

Men hvad er meningen i at lave et menu system til en console application???...

og menu punkterne skal vel også gemmes i en database...??



jeg har heller ikke gjort det helt rigtigt, men hvis det er lavet rigtigt er meningen at man kan lave en function der fx. hedder Mainmenu() og så kan du bruge addMenuItem, og removeMenuItem, og lave en swith, der fx. siger at hvis man vælger "start game" skal den fjernes fra Main menuen, og hvis der er laver en karakter/profil bliver der tilføjet en "choose profile" option i menuen.
dette kan spare mange linjers kode! har selv set et eksempel hvor en anden har gjort det, og det er skide smart!

men som sagt skal det overhovedet ikke laves på den måde som jeg har gjort det i koden i min første post (ikke engang selvom den virkede var det ikke den rigtige måde -_-)





ok... Men vis du er ny så prøv at start med at lave nogle mere simple ting.

Jeg har foreksempel lavet en BMI udregner der regner ud hvad din BMI er ved hjælp af den højde og vægt.



jeg skal bruge C++ til DirectX så jeg vil faktisk bare lære nogen ting som jeg kan få brug for fx. classes pointer, etc.
og en BMI udregner er jo entlig bare en lommeregner, så det ville ikke kunne lære mig meget :/

jeg har mere brug for en opgave der kræver klasser, bare på et lidt lavt niveau, bare for at lære det.

og jeg vil utrolig gerne vide hvordan jeg organisere min kode med header filer.
så et eksempel på et consol spil, hvor det hele var delt op i headers, og det var meget nemt at læse!
utrolig "ren" kode.



der er vel intet der direkte kræver klasser de gør det jo bare lettere??

det er ok at du ikke gider lave en BMI udregner, men nu bruger jeg den lige som eksempel:
I BMI udregneren kan du jo sagtens bruge klasser. Du kan lave en klasse der indeholder vægt, højde, resultat, og en metode til at regne det ud...

måden man plejer at bruge header filer på mht. klasser er beskrevet her: http://www.udvikleren.dk/C/Thread.aspx/1/24700/



Indlæg senest redigeret d. 27.05.2008 13:46 af Bruger #13669
<< < 12 > >>
t