Permalänk
Medlem

C++ nybörjare sitter fast.

Hej, håller på med en uppgift som jag har kommit en bit på. Men nu har jag kommit till ett problem som jag går bet på just nu iallafall.

#include <iostream> #include <string> #include <vector> class Person { public: std::string name; //Vill använda mig av så mycket engelska ord istället för svenska fast jag vet att det står i uppgiften att man skall använda int age; // namn & alder istället för name & age. void print(std::string _name, int _age) //Skriver void print istället för void SkrivUt. { name = _name; age = _age; } }; int linearsearch(Person p[], int n, int a) { for (int i = 0; i < n; i++) { if (p[i].age == a) return i; } return -1; }; void bubblesort(Person p[], int n) { int i, j, found = 1, temp; for (int m = n - 1; m > 0; m--) { found = 0; for (j = 0; j<n - 1; j++) { if (p[j].age > p[j + 1].age) { temp = p[j].age; p[j] = p[j + 1]; p[n + 1].age = temp; } } } } int main() { int age = 0; Person myList[10]; myList[0].print("Kalle", 22); myList[1].print("Stig", 42); myList[2].print("Jenny", 42); myList[3].print("Pelle", 69); myList[4].print("Kajsa", 26); myList[5].print("Stina", 17); myList[6].print("Emma", 12); myList[7].print("Karl", 72); myList[8].print("Erik", 3); myList[9].print("Oskar", 35); bubblesort(myList, sizeof(myList)); { std::cout << myList[10] << std::endl; std::cout << "enter age to search for./ End with ENTER." << std::endl; std::cin >> age; { linearsearch(myList, sizeof(myList), age); } } std::cin.get(); return 0; }

Det felmeddelande jag får just nu är.
Code E0349 no operator "<<" matches these operands line 61
Code C2679 binary '<<':no operator found wich takes a right-hand operand of type 'Person' (or there is no acceptable conversion)
och det är raden där jag skrivit

std::cout << myList[10] << std::endl;

Sen finns det säkert fler fel som jag inte hunnit märka eller kommit till än som säkert någon av er mer kunnig ser.
Har försökt kollat vad dessa koder byter men det jag får fram är typ att dom vill att man ska #include <string> och det har jag ju med så jag tror jag säkert skrivit något fel. Jag vill ju försöka använda mig av att skriva std::, för där det behövs men jag antar att jag har missat något sånt å säkert då jag vill försöka undvika att använda using namespace std.

Kommentera gärna om ni ser något som ser galet ut och försök rikta mig i rätt väg vill gärna lära mig. Jag är väl inte den snabbast på att lära mig men viljan finns här och är ganska envis.

Permalänk
Medlem

Vad förväntar du dig att den felande raden ska göra?

Visa signatur

h170i-plus i5 6600 2x8gb ddr3l 850 pro 256gb
Don't argue with an idiot. He will drag you down to his level, and beat you with experience.

Permalänk
Medlem
Skrivet av blewz:

Hej, håller på med en uppgift som jag har kommit en bit på. Men nu har jag kommit till ett problem som jag går bet på just nu iallafall.

#include <iostream> #include <string> #include <vector> class Person { public: std::string name; //Vill använda mig av så mycket engelska ord istället för svenska fast jag vet att det står i uppgiften att man skall använda int age; // namn & alder istället för name & age. void print(std::string _name, int _age) //Skriver void print istället för void SkrivUt. { name = _name; age = _age; } }; int linearsearch(Person p[], int n, int a) { for (int i = 0; i < n; i++) { if (p[i].age == a) return i; } return -1; }; void bubblesort(Person p[], int n) { int i, j, found = 1, temp; for (int m = n - 1; m > 0; m--) { found = 0; for (j = 0; j<n - 1; j++) { if (p[j].age > p[j + 1].age) { temp = p[j].age; p[j] = p[j + 1]; p[n + 1].age = temp; } } } } int main() { int age = 0; Person myList[10]; myList[0].print("Kalle", 22); myList[1].print("Stig", 42); myList[2].print("Jenny", 42); myList[3].print("Pelle", 69); myList[4].print("Kajsa", 26); myList[5].print("Stina", 17); myList[6].print("Emma", 12); myList[7].print("Karl", 72); myList[8].print("Erik", 3); myList[9].print("Oskar", 35); bubblesort(myList, sizeof(myList)); { std::cout << myList[10] << std::endl; std::cout << "enter age to search for./ End with ENTER." << std::endl; std::cin >> age; { linearsearch(myList, sizeof(myList), age); } } std::cin.get(); return 0; }

Det felmeddelande jag får just nu är.
Code E0349 no operator "<<" matches these operands line 61
Code C2679 binary '<<':no operator found wich takes a right-hand operand of type 'Person' (or there is no acceptable conversion)
och det är raden där jag skrivit

std::cout << myList[10] << std::endl;

Sen finns det säkert fler fel som jag inte hunnit märka eller kommit till än som säkert någon av er mer kunnig ser.
Har försökt kollat vad dessa koder byter men det jag får fram är typ att dom vill att man ska #include <string> och det har jag ju med så jag tror jag säkert skrivit något fel. Jag vill ju försöka använda mig av att skriva std::, för där det behövs men jag antar att jag har missat något sånt å säkert då jag vill försöka undvika att använda using namespace std.

Kommentera gärna om ni ser något som ser galet ut och försök rikta mig i rätt väg vill gärna lära mig. Jag är väl inte den snabbast på att lära mig men viljan finns här och är ganska envis.

Det felmeddelandet säger är väl just att det är ett objekt av typen Person som du försöker använda i ett kontext där det nog borde vara en sträng.

Typ:

std::cout << myList[10].name << std::endl;

kanske?

Sedan tycker jag att din "print" är väldigt konstigt namngiven med tanke på vad den gör.

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem

Din print är vad constructor för klassen borde vara, googla "c++ constructor". Sedan försöker du skriva ut ett element utav Person, men för att göra det måste du overloada << så att den vet vad den ska skriva ut, https://stackoverflow.com/questions/2981836/how-can-i-use-cou...

Notera även att index 10 som du angett är out of range (0-9 precis som du skrivit när du satte alla personer).

Permalänk
Medlem

@evil penguin:
Okej, tror jag hänger med på vad du menar att jag måste ha en sträng efter myList, men skulle man även kunna ha .age med också eller blir det fel då det är en int och inte en string ?

Och varför jag har print blev nog lite konstigt nu när du säger det, jag hade förut myList[].SetInfo (), Men sen trött som man är skulle man försöka hitta på något annat namn men det blev väl kanske inte så bra.

@wargreymon:
Ska kolla och läsa på om det mer imorgon om constructor. Kollade lite snabbt på länken du skicka om overloada hängde inte riktigt med på det hela där men ska läsa mer imorgon när man fått vila ut lite mera.
Det där med indexen har jag tänkt lite på också men det är nog för från exempel jag har i min övningsbok så har dom skrivit en lista från 0-9 sedan skrivit 10 vid den övre som om dom räknat att det är 10 index fast det börjar på 0.

Tack för snabba svar. Nu vet jag lite mer vad jag ska kolla på och ska läsa lite mer om de sakerna får se om jag kommer lite längre med det hela.

Permalänk
Medlem

@blewz: du försöker använda << på din klass, men du har inte specificerat vad som ska hända när man använder den operanden. Så du måste specificera vad den ska göra om du skickar in din klass. Det hade varit lättare att hjälpa om du skrev vad du ville skulle hända.

Permalänk
Medlem

Finns det något särskilt skäl till varför man vill definiera egna scopes manuellt som i koden? Har aldrig sett det tidigare faktiskt, är det någon ny "common practices" eller dylikt?

Permalänk
Skrivet av MrDoggo:

Finns det något särskilt skäl till varför man vill definiera egna scopes manuellt som i koden? Har aldrig sett det tidigare faktiskt, är det någon ny "common practices" eller dylikt?

Du kan göra det för att du vill begränsa synlighet och/eller livslängd på dina variabler. Exempelvis om du vill släppa dina referenser till en shared_ptr eller frigöra en resurs (om du kör RAII).

Permalänk

Det är några saker jag ser direkt som jag vill ändra på.

I en klass vill man oftast ha sina variabler privata och komma åt/ändra på dom med hjälp av getters och setters
Exempel:

class MyClass { private: int _x; public: int getX() { return _x; } void setX(int x) { _x = x; } };

Läs mer om klasser här.

I din bubblesort och linearsearch function tar du in:

sizeof(myList)

Gör ett test där du skriver ut storleken på en array av en klass och se vilket värde du får, du kommer märka att det inte är vad du vill att det ska vara. Du måste tänka på ett annat sätt att spara storleken på din array.
Läs mer om sizeof här.

Här vet jag riktigt inte hur du tänkt med dina brackets efter du har kallat på funktionen bubblesort och även längre fram, dom är onödiga i ditt fall.

bubblesort(myList, sizeof(myList)); { // <- Här std::cout << myList[10] << std::endl; std::cout << "enter age to search for./ End with ENTER." << std::endl; std::cin >> age; { // <- Här linearsearch(myList, sizeof(myList), age); } // <- Här } // <- Här

Det är även här du får ditt fel när du försöker skriva ut myList[10] med hjälp av std::cout. I det här fallet vet den inte vad den ska skriva ut eftersom din myList array är av objekt typen Person, du försöker även komma åt index 10 i en array av storleken 10 vilket är ett vanligt nybörjar misstag.
Läs mer om arrays här.

För att lösa detta så finns operatorer men du har nog inte kollat på det än vilket kommer göra det svårt för dig i just nu så en annan lösning kan vara bättre. Om du kollar på mitt exempel på getters så kan du få användning utav dom för att skriva ut just den variabel du vill komma åt från Person objekten i din array.

Hör av dig om du har mer funderingar!

Permalänk
Medlem

Nu har jag gjort om en hel del, vet inte än om det är till det bättre med det känns som jag själv hänger med lite mer.
det ser ut så här just nu.

#include <iostream> #include <string> class Person { private: std::string namn; int alder; public: void Person::SetInfo(std::string _namn, int _alder); std::string GetName(); int GetAge(); void SkrivUt(); }; int Person::GetAge() { return alder; } std::string Person::GetName() { return namn; } void Person::SetInfo(std::string _namn, int _alder) { namn = _namn; alder = _alder; } void Person::SkrivUt() { std::cout << "My name is " << namn << " and I'm " << alder << " years old" << std::endl; } int linsok(Person p[], int n, int a) { for (int i=0; i<n; i++) { if (p[i].GetAge() == a) return i; } return -1; }; void bubblesort(Person familj[], int n) { for (int i = 1; i<n; i++) { for (int j=0; j<n-1; j++) { if (familj[j].GetAge() > familj[j+1].GetAge()) { Person temp; temp = familj[j]; familj[j] = familj[j+1]; familj[j+1] = temp; } } } } int main() { int age = 0; Person familj[4]; familj[0].SetInfo("Kalle", 42); familj[1].SetInfo("Julia", 16); familj[2].SetInfo("Emma", 31); familj[3].SetInfo("Bill", 4); bubblesort(familj,4); //anropar bubblesort int index = linsok(familj, sizeof(familj), age); if (index == -1) std::cout << "No family member found!"; else std::cout << "The member family member you found is " << familj[index].GetName() << std::endl; std::cin.get(); return 0; }

Dold text

Fast sen är det några delar jag tror jag borde kunna ändra på uppe vid min class.
Det känns som jag borde kunna ha min

int Person::GetAge(){ return alder; }

&

std::string Person::GetName(){ return namn; }

i en och samma ?
För jag tycker själv att det ser lite rörigt ut där uppe vid min class men jag tror det funkar så iallafall.
Men det jag har mest problem med är min linsok och min bubblesort.

Sen som ni några skrev tidigare så kan det ju kanske vara en fördel av mig att skriva vad jag vill få ut av själva uppgiften.
Det är tre uppgifter och i den tredje så skall man använda de två första tillsammans med den tredje
Först ska man skapa en klass "Person" som innehåller två attribut:
string namn
int alder
som lagrar personens namn och ålder, samt metoden
void SkrivUt()
som skriver ut innehållet i variablern namn och alder på skärmen.

Sedan andra delen ska man skriva en funktion för linjär sökning i en vektor p med Person-objekt.

int linsok(Person p[], int n, int a)

Funktionen ska söka igenom vektorn p efter en person med åldern a och returnera index för den personen. Om ingen person hittas returneras -1. Variabeln n är antalet element i vektorn.

Skriv också en funktion som sorterar en Person-vektor efter ålder (yngst först).

void bubblesort (Person [], int n)

Sen vill dom att man gärna använder nedanstående funktion för att byta plats på två element

void byt (Person &p, Person &q) { Person temp; temp.namn = p.namn; temp.alder = p.alder; p.namn = q.namn; p.alder = q.alder; q.namn = temp.namn; q.alder = temp.alder; }

Sen i tredje delen så vill dom att man göt ett huvudprogram (main) för att testa din klass och dina funktioner.
Deklarera en vektor familj med fyra personer:

Person familj[4];

Som fylls med innehåll - namn och ålder på fyra personer. Programmet ska sedan sortera vektorn familj och skriva ut familjemedlemmarna i åldersordning med yngsta först. Till sist ska funktionen linsok anropas och söka efter om någon familjemedlem har en viss ålder.

Nu vet jag att jag skrev en hel del men ville få med så ni ser vad uppgiften går ut på.
Men det är ju fortfarande något som inte funkar för när jag försöker köra programmet så kommer jag in i en flik iosfwd
där det står väldigt mycket och för mig som är väldigt grön och ny så har jag svårt att se vad felet är.
Det jag ser är att den stannar på en rad med

return ((_Elem *)_CSTD memcpy(_First1, _First2, _Count));

Sen i rutan med (X) står det
Exception thrown at 0x6E404860 (vcruntime140d.dll) in Uppgift 3.2.exe: 0xC0000005: Access violation reading location 0xCCCCCCCC.

Ifall någon känner att den vill hjälpa denna dumbom som är seg att lära sig men vill så tackar jag för alla tips och råd. Jag vill även tacka dom som skrivit ovanför.

Permalänk

@blewz:

Din klass ser mycket bättre ut nu och jag kan förstå att det ser klottrigt ut med alla funktioner men det är något man måste acceptera, klasser kan bestå av väldigt många funktioner ibland.

Nu när du beskriver din uppgift så skriver dom att du ska använda dig utav vektorer så råder jag dig att läsa mer om dom här, vektorer är lite smidigare än arrays vilket kan hjälpa dig med att hålla reda på storleken.
Ibland kan det vara bra att ha en person som beskriver saker så jag kan tipsa om att söka upp en youtube video på vektorer också.

int index = linsok(familj, sizeof(familj), age);

Här använder du dig fortfarande utav sizeof när du kallar på din linsok function, jag råder dig att göra testet jag beskrev i mitt tidigare svar. Tänk nu på att dom vill att du ska använda vektorer för att lagra Person objekten så sök upp hur man får storleken på en vektor så kommer du få det mycket lättare!
Du passerar även in "age" här som du tidigare tilldelat 0, här tror jag att du tänkt användaren av programmet ska skriva in en ålder som programmet ska söka efter.

std::cout << "The member family member you found is " << familj[index].GetName() << std::endl;

Här använder du dig nu utav en getter för att komma åt namnet på Person objektet som linsok funktionen hittade vilket är kanon, men i uppgiften nämner du att dom vill att du ska använda dig utav skrivUt funktionen som ser fullt duglig ut att kunna användas, komihåg bara att du använder dig utav std::cout redan i den funktionen.

Ett tips är att börja smått. Innan du använder dig utav funktioner för att ändra på informationen i vektorn så som din bubblesort och senare byt funktionen, se till att du kan komma åt och skriva ut det du vill i Person objekten samt även ändra på informationen manuellt!

Permalänk
Medlem
Skrivet av blewz:

Fast sen är det några delar jag tror jag borde kunna ändra på uppe vid min class.
Det känns som jag borde kunna ha min

int Person::GetAge(){
return alder;
}
&

std::string Person::GetName(){
return namn;
}
i en och samma ?

Problemet med att returnera flera värden samtidigt är att du tvingas parsa din utdata innan du kan använda den på ett vettigt sätt. Kombinera detta med att funktionerna blir komplexare i onödan samt att man vill upprätthålla någon form av "Single responsibility principle", dvs att en funktion ska ha ett särskilt syfte och inte flera syften.

Getters i klass-sammanhang är ju trots allt också något man förväntas ha, eftersom tanken är att enkapsulera funktionaliteten i klasser. Det är för att somliga värden ska hållas privat inom klassen och då hanterar man dessa genom metoder som getters/setters istället.

Permalänk
Medlem

Om du använder dig av std::vector så skulle du dessutom istället för att ha din egen bubblesort inkludera <algorithm> och anropa std::sort().
Kolla också upp std::array.

Visa signatur

För övrigt anser jag att tobak ska förbjudas.

Permalänk
Medlem

@ChristofferW:
Tack för dina svar känns som du förklarar så en nybörjare som mig hänger med vilket är tacksamt
Har kollat lite på det med vectorer sen även läst i boken som hör till kursen och på en video på youtube, så skriver han t.ex
myVector.push_back(value) och har ofta .size(), .at(index) m.m ser ju att det finns massa olika typer man kan använda sig utav är det något sånt jag borde göra också när jag använder mig av att skriva en vector?

För i min kursbok så visar dom som exempel bara att man kan skapa en vektor

// Skapa vektorn: int temperature[5];

Då dom aldrig i boken skriver med något .push_back eller någon annan sort.

Där du säger att jag redan använt mig utav std::cout till min funktion SkrivUt(), räcker det då att jag anropar den nere i main om jag förstår dig rätt ?

Permalänk

@blewz

Skrivet av blewz:

Har kollat lite på det med vectorer sen även läst i boken som hör till kursen och på en video på youtube, så skriver han t.ex
myVector.push_back(value) och har ofta .size(), .at(index) m.m ser ju att det finns massa olika typer man kan använda sig utav är det något sånt jag borde göra också när jag använder mig av att skriva en vector?

Det är just det som gör vektorer lite smidigare genom att dom håller reda på storleken åt dig så fort nya element läggs in i vektorn.

Skrivet av blewz:

För i min kursbok så visar dom som exempel bara att man kan skapa en vektor

// Skapa vektorn: int temperature[5];

Då dom aldrig i boken skriver med något .push_back eller någon annan sort.

Här börjar jag bli lite fundersam över om dom vill att du ska använda dig utav array containers eller vektorer..
Jag är rätt så säker på att du kollar på arrays just nu i kursboken och att vektorer tas upp längre fram.
Varför dom skriver "Skapa vektorn:" när dom skapar en array är lite konstigt för mig då det kan förvirra nybörjare som dig framöver när vektorer tas upp..

Från dina tidigare inlägg så tyder det på att du ska använda dig utav arrays nu när jag tänker på det.

Skrivet av blewz:

Sedan andra delen ska man skriva en funktion för linjär sökning i en vektor p med Person-objekt.

int linsok(Person p[], int n, int a)

Sen i tredje delen så vill dom att man göt ett huvudprogram (main) för att testa din klass och dina funktioner.
Deklarera en vektor familj med fyra personer:

Person familj[4];

Är funktionen och deklarationen här förslag från uppgiften?
Du borde fråga kurshandledaren om det verkligen är array containers eller vektorer dom vill att ni ska använda, läs också om uppgiften lite noggrannare och se om det är något du har missat

Skrivet av blewz:

Där du säger att jag redan använt mig utav std::cout till min funktion SkrivUt(), räcker det då att jag anropar den nere i main om jag förstår dig rätt ?

Här tänker du helt rätt, enklast är att testa sig fram!

Permalänk
Medlem
Skrivet av ChristofferW:

@blewz
Det är just det som gör vektorer lite smidigare genom att dom håller reda på storleken åt dig så fort nya element läggs in i vektorn.

Här börjar jag bli lite fundersam över om dom vill att du ska använda dig utav array containers eller vektorer..
Jag är rätt så säker på att du kollar på arrays just nu i kursboken och att vektorer tas upp längre fram.
Varför dom skriver "Skapa vektorn:" när dom skapar en array är lite konstigt för mig då det kan förvirra nybörjare som dig framöver när vektorer tas upp..

Från dina tidigare inlägg så tyder det på att du ska använda dig utav arrays nu när jag tänker på det.
Är funktionen och deklarationen här förslag från uppgiften?
Du borde fråga kurshandledaren om det verkligen är array containers eller vektorer dom vill att ni ska använda, läs också om uppgiften lite noggrannare och se om det är något du har missat

Här tänker du helt rätt, enklast är att testa sig fram!

Nu när jag läser lite noggrannare i boken så har dom skrivit så här:

I detta kapitel kommer vi att tala om en speciell typ av variabler som kallas vektorer. En vektor kan ses som en lista, som kan innehålla olika värden. Ett sådant värde kallas element. Vi kan komma åt varje element i vektorn med något som kallas för index.

Vektorer är mycket användbara inom programmering då man vill hålla reda på många saker samtidigt. Ett konkret exempel är skott på en bana i ett spel. Alla skott som spelaren har skjutit har en position och en riktning. Det kan finnas massor av skott på skärmen samtidigt. Dessa skott lagras då inte i en enskilda variabler utan de lagras som vektorer.

Värt att veta är att vektorer ofta kallas arrayer (efter engelskans array).

Så står det i början av kapitlet som kallas för Vektorer. I boken. Men på dig så antar jag att det är arrayer dom menar istället alltså ?
Blir lätt förvirrande för mig när man inte är säker på vad som skall användas.

Permalänk

@blewz: Okej så det är arrayer dom är ute efter att du ska använda så som det ser ut.

Då kan vi gå tillbaks till där du använde dig utav sizeof

int index = linsok(familj, sizeof(familj), age);

Här skriver dom: "Firstly, the sizeof() operator does not give you the number of elements in an array, it gives you the number of bytes a thing occupies in memory".
Så du måste tänka på ett annat sätt att spara storleken på din array som du kan passera in I din linsok funktion.

Sen har du redan kommit fram till hur du ska använda din skrivUt() funktion!

Funderar du över något mer så säg till!

Permalänk
Medlem

@ChristofferW:
Har kommit lite längre nu men inte mycket.
Har fått anropet på SkrivUt() att fungera genom att skriva:

Person().SkrivUt();

Så nu verkar den anropa SkrivUt funktionen, dock så verkar det inte fungera som jag hoppades då den ej skriver ut några namn eller ålder.
Så nu antar jag att jag har gjort något fel upp i min

void Person::SkrivUt() { std::cout << "The family members is " << namn << std::endl << " and they are " << alder << " years old" << std::endl; }

Ändrade lite på texten men som sagt det jag vill är ju att den ska skriva ut den namnen i rätt ordning då den ska sortera med bubblesort först, och när jag kör debug och kör step into så ser det ut som min bubblesort funkar som den ska för den sorterar familj och lägger yngst först. Men det är ju hur jag ska få till att SkrivUt funktionen använder den sorterade ordning från bubblesort.
Sen vet jag inte om det fattas något mer i min main där jag skrivit min

Person familj[4]; familj[0].SetInfo("Kalle", 42); familj[1].SetInfo("Julia", 16); familj[2].SetInfo("Emma", 31); familj[3].SetInfo("Bill", 4);

Det känns som jag behöver något mer men kan inte komma på vad det skulle vara just nu.

Sen själva linsok delen har jag inte hunnit kollat på än då jag vill få det här sakerna att fungera först.
Har kollat lite på det där med sizeof och på det trådar man läser så tycker ju många man ska använda vector istället men nu ska ju inte jag göra det i min uppgift. Det jag sett är att man kanske ska använda sig av en new.. Men som sagt jag kanske har helt fel har inte kollat jätte noga på den delen än då jag inte fått min SkrivUt att fungera rätt än.

Permalänk
Medlem
Skrivet av blewz:

@ChristofferW:
Har kommit lite längre nu men inte mycket.
Har fått anropet på SkrivUt() att fungera genom att skriva:

Person().SkrivUt();

Så nu verkar den anropa SkrivUt funktionen, dock så verkar det inte fungera som jag hoppades då den ej skriver ut några namn eller ålder.

Din utskriftsfunktion ser ok ut, men sättet du anropar den på är fel. C++ tillåter att man "kedjar ihop" funktionsanrop. Om man t.ex. har en funktion som returnerar ett objekt så kan man anropa en av objektets metoder genom t.ex.

func().method(); // Anropar metoden 'method' på objektet som 'func' returnerar.

I ditt fall så anropar du först Person(), vilket är konstruktorn för klassen Person. Du verkar inte ha skrivit någon konstruktor själv, så kompilatorn kommer generera en åt dig automatiskt. Resultatet är att Person() kommer returnera ett nytt Person-objekt där variabeln namn är tom och alder är oinitialiserad. Du anropar sedan utskriftsfunktionen på detta "tomma" objekt, vilket nog inte är vad du faktiskt vill göra.

Egentligen är det dålig design i det här fallet att inte ha en vettig konstruktor för klassen, men du har kanske inte kommit till konstruktorer ännu (lite konstigt i så fall, men jag vet inte vilket upplägg din bok har). Vad du vill göra är i alla fall att anropa utskrftsfunktionen på ett objekt som du redan initialiserat med SetInfo, t.ex.

Person p; p.SetInfo("Kalle", 42); p.SkrivUt();

Skrivet av ChristofferW:

Varför dom skriver "Skapa vektorn:" när dom skapar en array är lite konstigt för mig då det kan förvirra nybörjare som dig framöver när vektorer tas upp..

En vektor är en 1-dimensionell array, medan flerdimensionella arrayer kallas för matriser. std::vector är sedan en implementation av konceptet vektor som en klass:

int v[3]; // En vektor och även en typ av array. int m[4][4]; // En matris och även en typ av array. std::vector<int> v; // En instans av std::vector som är en vektor-klass.

Så det är korrekt som det står i boken, även om en nybörjare i programmering (eller mer erfarna för den delen) kanske inte är bekant med de matematiska begreppen vektor och matris.

Permalänk
Medlem

@perost @ChristofferW
Äntligen, nu har jag fått det att fungera hela programmet.
Det tog lång tid men det var värt det
Får tacka för all bra hjälp man fått här, jag är säker på att det är nog inte sista gången jag frågar om råd och hjälp.