Permalänk
Medlem

(C++) Array med objekt

Hej!

Jag får ingen ordning på konstruktorn i en klass jag håller på att göra. Försöker att göra en array som ligger i klassen Player. Arrayen ska innehålla 5 platsen för objekt av typen Card. Hur ska jag initialisera dessa i konstruktorn?

Jag har rensat några rader men här är de viktigaste. OBS. Ingen dynamisk allokering.
-----------------------------------
Player.h:
#include "Card.h"

private:
int number;
Card cards[5];
public:
Player();
-----------------------------------
Player.cpp:

#include "Player.h"
Player:: Player() {
this->number = 0;
this->cards = ???
}

Tacksam för svar!

Permalänk

Du kan ju enklast göra
for(int i=0;i<5;i++)
this->cards[i]=new Card();

detta kräver ju iofs att du gör om din Card cards[5] till Card *cards[5]

Visa signatur

Awaken Mustakrakish the Lake Troll
5950x, 3090 FE

Permalänk
Medlem

En liten sidofråga, men varför skriver du tex this->number = 0 istället för att bara skriva number = 0 när du initierar variablerna ?

Helst "bör" man även initiera så mycket som möjligt direkt i initieringslistan före huvudkroppen till konstruktorn, det blir lite snyggare och snabbare.

För att återgå till frågan så behöver du inte initiera någonting i din vektor. Defaultkonstruktorn kommer att användas till att automatiskt skapa alla objekt i vektorn.

Edit :
Här finns lite fallgropar man får akta sig för. För att defaultkonstruktorn i Cardklassen ska kunna anropas måste det givetvis finnas en sådan. En sådan genereras automatiskt såvida du inte själv skapat en egen konstruktor.
Gör du en egen konstruktor som tar argument måste du även skriva en defaultkonstruktor (om vektorer som du har i din playerklass ska kunna initieras automatiskt). Kompilatorn slutar att automatisk kontruera en sådan för dig så fort du gör en egen konstruktor.

Sedan kanske du vill initiera en spelares kort när du skapar spelaren och då använda någon annan konstruktor till klassen Card. Då får du tilldela alla elementen i din cardvektor med denna andra konstruktor, tex cards[4] = card("ess") eller hur nu din alternativa konstruktor ser ut.

Visa signatur

Namn : Jesper | Ålder : 48 | In-game namn : iller
Yrke : Kvantanalytiker, systemutvecklare.
Utbildning : PhD matematik. Självlärd med över 10 års erfarenhet av finansiell matematik och associerade ämnen.

Permalänk
Medlem

Tack för svaren. Jag löste det nu.

Använder this vid initieringen för att jag har parametrar med samma namn i andra konstruktorer. Då kör jag konstant med det så att det inte blir fel.

Vad menas med initieringslistan före huvudkroppen? Kom gärna med ett exempel på ett sådant.

Permalänk
Medlem
Skrivet av Plala:

Vad menas med initieringslistan före huvudkroppen? Kom gärna med ett exempel på ett sådant.

Säg att du har en klass jul med en medlemsvariablel som heter tomte som är av typen int och en annan medlemsvariabel som heter AntalKlappar .
Då kan du i konstruktorn dels initiera den som

jul ()
{
tomte = 5;
AntalKlappar = 10;
}

eller så kan du skriva

jul(): tomte(5), AntalKlappar(10) {}

, vilket gör samma sak, fast brukar anses lite snyggare och är lite snabbare.
Det senare kallas att använda sig av initieringslista.
(Att det är snabbare kanske inte har någon märkbar betydelse för mindre program, men för större program och mer invecklade typer kan det göra en liten skillnad.)

Visa signatur

Namn : Jesper | Ålder : 48 | In-game namn : iller
Yrke : Kvantanalytiker, systemutvecklare.
Utbildning : PhD matematik. Självlärd med över 10 års erfarenhet av finansiell matematik och associerade ämnen.

Permalänk
Medlem

Bör även tilläggas att du kan ha en parameter med samma namn som medlemsvariabel i initieringslista.

Visa signatur

| Antec P183 | AMD Phenom 2 940 | Corsair XMS2 DDR2 8192 MB | XFX HD4870 | Gigabyte MA-790X-UD3P | Corsair VX 450W | Primärt OS: Arch Linux | Windows 7 x64 |

Permalänk
Medlem

Tack för svaren än en gång.

Får väl börja med initieringslista i framtiden då. Det verkar nice.

Permalänk
Medlem

Tänkte låna tråden lite och fråga om mitt problem stämmer överens på trådskaparens?

Det är så att jag försöker få in attributer från en annan klass, t.ex hus1 till en objektpekare tillhörande klass hus2 men är av typ hus1.

Alltså det handlar om en dynamisk objektarray, även om trådskaparen inte använder en sådan

Visa signatur

Stationära: Ryzen 7 3700X | 32GB DDR4 3200MHz | EVGA Geforce 1070 8GB | 120GB Intel 520 SSD | 500GB Samsung 850EVO |
Server/ NAS : Phenom2 X4 965 | 6GB DDR2 RAM | Nvidia 6600LE 128MB | WD Red 3TB | Ubuntu server 16.04
HTPC: Raspberry Pi 2 | 8GB class 6 SD card | 900MHz quad core