C++ fråga angående skapandet av en länkad lista

Permalänk
Medlem

C++ fråga angående skapandet av en länkad lista

Jag har fått i uppgift att skapa en stack med hjälp av en länkad lista.
Boken jag använder är Jan Skansholms C++ Direkt och där har de ett exempel där han skapar en lista genom att skriva nedanstående.

class Element{
public:
Element *m_pNext;
int m_data;
Link (double data, Link *pNext) : m_data(data), m_pNext(pNext){}
}

Min lärare har gett oss en pdf med en liknande lösning men den skiljer på en rad.
Denna:
Link (double data, Link *pNext);

Så till min fråga. Det efter : dvs ( : m_data(data), m_pNext(pNext){} ) i Jan Skansholms exempel. Vad används det till för, vad är det?
Jag hittar inget på google då jag inte vet hur jag ska formulera frågan. =(

Tacksam för svar.

Permalänk
Medlem

Det är samma som att skriva

Link (double data, Link *pNext) { m_data = data; m_pNext = pNext; }

Möjligen en prestandavinst att skriva som i boken...

Permalänk
Medlem

Det är en initieringslista. Som du ser så innehåller den medlemsvariablerna m_data och m_pNext, och vad som händer är att dessa ges värdena från parametrarna data och pNext som skickas in till funktionen. Skillnaden i din lärares lösning är att han bara har skrivit prototypen. Troligen kommer du om du kollar i resten av koden hitta något som ser ut i stil med:

Link (double data, Link *pNext) { m_data = data; m_pNext = pNext; }

Den funktionen gör samma sak som varianten med initieringslistan (det är inte riktigt samma sak, men skillnaden spelar ingen roll i det här fallet). Initieringslistor är mer användbart när man t.ex. vill återanvända en annan konstruktor istället för att kopiera kod, vilket bl.a. är bra när man håller på med arv. Just nu krånglar bara boken i onödan tycker jag, men det beror väl på vilken nivå den håller.

Jag är dock lite fundersam över varför funktionen Link, som tycks vara en konstruktor, inte heter Element som klassen, vilket konstruktorer ska göra vad jag vet.

Edit: Var lite sen tydligen.

Permalänk
Medlem
Skrivet av Thomas H:

Det är en initieringslista. Som du ser så innehåller den medlemsvariablerna m_data och m_pNext, och vad som händer är att dessa ges värdena från parametrarna data och pNext som skickas in till funktionen. Skillnaden i din lärares lösning är att han bara har skrivit prototypen. Troligen kommer du om du kollar i resten av koden hitta något som ser ut i stil med:

Link (double data, Link *pNext) { m_data = data; m_pNext = pNext; }

Den funktionen gör samma sak som varianten med initieringslistan (det är inte riktigt samma sak, men skillnaden spelar ingen roll i det här fallet). Initieringslistor är mer användbart när man t.ex. vill återanvända en annan konstruktor istället för att kopiera kod, vilket bl.a. är bra när man håller på med arv. Just nu krånglar bara boken i onödan tycker jag, men det beror väl på vilken nivå den håller.

Jag är dock lite fundersam över varför funktionen Link, som tycks vara en konstruktor, inte heter Element som klassen, vilket konstruktorer ska göra vad jag vet.

Edit: Var lite sen tydligen.

För att svara på din fråga angående Link. Det är jag som döpt min variant till Link, blandade ihop lite med bokens

Permalänk
Medlem

En annan snabb fråga
Jag ser på internet att många använder sig av
///****
temp->data = info;
****////
Hur fungerar det där? Det är pilen mellan temp och data jag inte förstår.

Permalänk
Medlem
Skrivet av Xclusiv8:

En annan snabb fråga
Jag ser på internet att många använder sig av
///****
temp->data = info;
****////
Hur fungerar det där? Det är pilen mellan temp och data jag inte förstår.

Att skriva temp->data = info har precis samma effekt som att skriva (*temp).data = info, men är lite enklare att skriva.
(dvs du avrefererar pekaren temp och instansierar sedan medlemsvariabeln data)

Visa signatur

Namn : Jesper | Ålder : 45 | In-game namn : iller
Yrke : Matematisk modellerare (finansiell matematik), mjukvaruutvecklare för risksystem.
Utbildning : Doktor i matematik + en del mat-stat, numme och IT-relaterat.

Permalänk
Medlem
Skrivet av Xclusiv8:

En annan snabb fråga
Jag ser på internet att många använder sig av
///****
temp->data = info;
****////
Hur fungerar det där? Det är pilen mellan temp och data jag inte förstår.

Pilen är precis som punkten en accessoperator som används för att komma åt (publika) medlemmar i objekt. Vilken som ska användas beror på typen som temp är. Antingen kan det vara ett värde (objekt), eller en pekare till ett värde, och det är där som skillnaden mellan punkten och pilen ligger i princip.

class MyClass { public: int data; }; ... MyClass a; //Skapar ett objekt MyClass *b; //Skapar en pekare till ett (potentiellt) objekt b = new MyClass(); //Skapar en objekt och får b att peka på det a.data = 42; b->data = 42;

Man kan som Jesper säger krångla med att referera/avreferera objekt/pekare om man vill använda den ena eller den andra operatorn, men personligen tycker jag bara det gör det ännu krångligare.

Permalänk
Medlem

Ahh! Got it, tackar