Deklaration af varibler i en klasse deklaration

Tags:    c++

Fold kodeboks ind/udKode 


her er det første af en klasse. Compileren er ikke særlig glad for linjen: Player player[2] = {player(board), player(board)};

Jeg tror det er fordi jeg ikke helt har forstået det der med at initialisere variabler.

jeg ved godt at vis man vil initialisere et objekt med en constructor ser det sådan her ud:

klassenavn variablenavn(parametre);

men kan man også gøre det i en klasse dekleration?

Jeg kan i hvert fald se at man ikke kan initalisere et array i en en klasse deklaration. Men hvor skal man så gøre det? kan man godt gøre det i constructoren til den klasse man deklarere variablerne i, uden at bruge new keyworded, for jeg har hørt man kan skal bruge det sammen med pointers?

desuden, vis man skal deklarere en funktion der tager en reference til et objekt, i en klasse deklaration, lad os sige en int, hvordan gør man så?

en almindelig deklaration ser sådan ud
int funktion(int);

men hvad vis det er en referance er det så sådan her:
int funktion(int&);

eller skal man give referencen et navn selvom det bare er deklarationen?
int funktion(int &i);



8 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Du bliver nødt til at initialisere dit player array i constructoren, man kan ikke gøre det i klasse deklarationen. Og du kan godt gøre det uden at bruge new.

Hvis funktionen skal tage en reference skal du bruge en af disse i din klasse deklaration:
int funktion(int&);
int funktion(int& i);

Der er ikke nogen reel forskel, men oftest bruger man den sidste form, fordi det giver dig mulighed for at give parameteren en navn, som kan være et hint til hvad parameteren betyder. Hvis der kun er en parameter betyder det ikke det store, men hvis der er mange parametre er det rart at kunne se hvad de forskellige parametre betyder.



Ok.

Skriver man så bare:

player[x] = player(board);

i Constructoren?

Og desuden, bliver den så ikke initaliseret 2 gange? først i klassen, også i constructoren?



Indlæg senest redigeret d. 20.11.2008 17:09 af Bruger #13669
Jeg har nogle problemer med at få det til at virke... ved ikke om det har noget med det her problem at gøre, men nu poster jeg her.

min deklaration af min Player constructor ser sådan ud:
Fold kodeboks ind/udKode 


Min constructor til Player ser sådan ud:
Fold kodeboks ind/udKode 


min game klasses private del ser sådan ud:
Fold kodeboks ind/udKode 

og min construtor til Game ser sådan ud:
Fold kodeboks ind/udKode 


i Game constructoren får jeg denne fjel
no matching function for call to `Player::Player()'

candidates are: Player::Player(const Player&)
Player::Player(Board&)

Jeg vil mene at det ER Player::Player(Board&) jeg kalder.

:P = : og P



Indlæg senest redigeret d. 20.11.2008 18:40 af Bruger #13669
Det er ikke helt simpelt, så lad mig uddybe lidt. Det der gør det lidt kompliceret er at du ikke bruger default constructor til de objekter du har i dit array.

Der er flere måder at løse problemet på.

Du kan new'e dine Players:
Fold kodeboks ind/udKode 


Eller du kan lave en default construktor til Player og så lave en Init funktion:
Fold kodeboks ind/udKode 


Du kan også lave dit array om til en std::vector:
Fold kodeboks ind/udKode 


Bemærk at Player's constructor kun bliver kaldt én gang her, den anden player bliver et kopi af den første, det er måske ok, elles kan man:
Fold kodeboks ind/udKode 


Så bliver constructoren kaldt to gange.

Der er funktionelt ikke de store forskelle på de fire måder at gøre det på, så det er mest et spørgsmål om at finde den metode du synes passer bedst i dit tilfælde.



Ok. Vil lige tænke over de forskellige mugligheder. Tak



Jeg tror jeg vil bruge en vector istedet. Jeg forstår bare ikke hvordan du bruger den i eksemplet.

hvad går det der kolon? og hvorfor deklarere du først vectoren efter du putter ting ind i den?

Desuden forstår jeg ikke helt hvordan det andet argument i vectoren fungere. hvad vis ens objekt i vectoren har mere end et argument i constructoren?

.:Edit:.
Og foresten. Kan man godt definere en funktion i deklarationen i klassen ligesom du gør med player's constructor, eller er det bare en slags pseudo kode?



Indlæg senest redigeret d. 21.11.2008 18:36 af Bruger #13669
hvad går det der kolon?

I en constructor begynder : en initialiserings liste, så disse to laver stort set det samme:

Fold kodeboks ind/udKode 


Fold kodeboks ind/udKode 


For simple datatyper som int er der ikke nogen reel forskel, men teknisk set sker der det i andet tilfælde at n får en dummy værdi, og derpå får værdien fra _n. Man foretrækker normalt den første metode. Hvis klassen indeholder const eller referencer er man nødt til at bruge den første metode.

hvorfor deklarere du først vectoren efter du putter ting ind i den?

Det forstår jeg ikke. Det er ligegyldigt hvilen rækkefølge variable og funktioner har i klassen.

Det der sker i 3. eksempel med player(2, board), som er at vectoren bliver 2 stor, der oprettes én instans af player med constructoren og den anden er et kopi. board bliver brugt i kaldet til constructoren af Player. Man kunne også skrive:
Fold kodeboks ind/udKode 

Denne metode er nødvendig hvis Player constructoren tager flere argumenter.


Og foresten. Kan man godt definere en funktion i deklarationen i klassen ligesom du gør med player's constructor, eller er det bare en slags pseudo kode?

Ja det kan man godt, nej det er ikke bare pseudo kode.



Indlæg senest redigeret d. 21.11.2008 20:13 af Bruger #4996
Ok.
std::vector<string> vector(1000, "tak");



t