Programmering c++ akut hjälp, class och funktioner

Permalänk
Medlem

Programmering c++ akut hjälp, class och funktioner

Hej, har flera gånger tagit del av gamla trådar här på sweclockers för tidigare problem i livet. Men nu är det äntligen dags att tillföra ett eget problem.
Först och främst ja jag har sökt, tro mig jag har sökt..
Är lite trött i huvudet i skrivande stund då klockan är mycket så ha överseende med eventuella felstavningar eller knäppa formuleringar.

Mitt problem är att jag kört fast på en uppgift där jag skall skapa ett program med en klass. Person som skall innehålla namn och ålder, detta var inget problem.

Sedan en funktion för linjär sökning, vet inte om det fungerar ännu då hela programmet lär sättas samman innan det får testas. Men tror att det är rätt.(fast ändå inte då operanderna inte vill fungera i min kod).
(Tilläggas här skall väl också göras att jag är väldigt färsk på området programmering).

Sedan är det en funktion för bubblesort. Tror även jag fått till själva koden men det är själva sammansättningen som får mig att slita håret från huvudet.

Själva problemet i sig är väl att jag saknar kunskapen för vilka metoder jag skall använda för att koppla samman det då de vanliga sakerna inte vill fungera för mig. Till exempel familj[4] = pers1.get_alder; Måste jag lägga..
Okej där har jag löst 1 fel själv ska bara vara pers1.
Jaha men det var redan innan jag fått svar väldigt givande att skriva hit märker jag. Har redan rätt ut det mesta.

(OBS ej testat ni hittar säkert fel och saker som inte kommer fungera men enligt compilatorn är det bara operanderna just nu som det verkar.

Håller verkligen tummarna för att ni kan komma med bra information. Kan ni bara leda mig på rätt väg så skulle jag vara otroligt tacksam.

#include "stdafx.h" #include<iostream> #include<string> #include<vector> using namespace std; class Person { private: string namn; // Lägger dessa i privat för att det känns fel att ha denna information public. int alder; public: //Här innuti använder jag get/set för att enkelt kunna hämta/ange namn/ålder på eventuella personer. void skrivut() //Funktionen skrivut som kan anropas i samband med en person för att skriva ut informationen om denne person. Enligt cout nedan. { cout << "Personen /x84r " << alder << "/x86r gammal och heter " << namn << "." << endl; //Utskrift vid anrop av funktionen skrivut() } string get_namn() { return namn; } void set_namn(string set) { namn = set; } int get_alder() { return alder; } void set_alder(int set) { alder = set; } }; int linsok(Person p[], int n, int a)//Funktion för linjär sökning av ålder { int i=0; for(i=0;i<n;i++) //Söker igenom hela array:n. { if(p[i] == a) //Om p[i] är lika med sökt värde så returneras i. *****FEL: Operanden == no operator matching these operands. Antar att det har med pekare att göra. Eftersom p[i] är * som jag förstått det ska något likt -> användas men då blir det ändå problem (expression must have pointer type)***** { return cout << p[i] <<endl; } } return -1; //annars returneras -1. }; void bubblesort(Person p[], int n) //sorteringsalgoritm. { int i, j, funnen=1, temp; //Deklarerar de värden som krävs vid sorteringen for(i=0; i<=n-1 && funnen; i++) { funnen=0; for(j=0; j<n-1; j++) //Går igenom hela listan { if(p[j] > p[j+1]) //Om p[j] är större än p[j+1] flyttas p[j] till en temporär plats i temp för att sedan få sin rätta plats. *****FEL: Samma sak gäller här operanden fungerar inte.****** { temp = p[j]; ******FEL: kan inte konvertera class person * to int***** p[j] = p[j+1]; p[j+1] = temp; funnen = 1; //Loppen pågår tills dess att inget tal i arrayn behöver flyttas. } } } return; }; int main() { int age = 0; Person familj[4]; //Deklarerar array:n familj med 4 platser { Person pers1; //Familjemedlemmar skapas. Person pers2; Person pers3; Person pers4; pers1.set_alder(14); //Familjemedlem 1 blir tilldelad en ålder. pers1.set_namn("olof"); //Familjemedlem 1 blir tilldelad ett namn. pers1.skrivut(); //Familjemedlem 1's tilldelade ålder & namn skrivs ut. pers2.set_alder(6); pers2.set_namn("Lisa"); pers2.skrivut(); pers3.set_alder(37); pers3.set_namn("Lena"); pers3.skrivut(); pers4.set_alder(42); pers4.set_namn("Erik"); pers4.skrivut(); { familj[1] = pers1; //Tilldelar varje familjemedlem en plats i arrayn. familj[2] = pers2; familj[3] = pers3; familj[4] = pers4; { bubblesort(familj, sizeof(familj)); //Anropar funktionen bubblesort för att sortera array:n familj[4]. { cout << familj <<endl; cout << "Ange en /x86lder att s/x94ka efter./n Avsluta med ENTER." << endl; //Skriver ut anvisningar till användaren cin >> age; //Låter användaren mata in åldern att söka efter. } linsok(familj, sizeof(familj), age); //Söker efter det angivna värdet och om detta hittas returneras det } } } system("PAUSE"); return EXIT_SUCCESS; }

Kommer markera med *** där det är operand fel. Ursäkta om jag strukturerat koden konstigt som sagt hållit på i 1 vecka med programmering så är väldigt färsk.

Först till en viktigt fråga för mig. Visst är familj[4] en array och inte en vector.
Detta är vad som står om min uppgift för den delen:

Deklarera en vektor familj med fyra personer:
Person familj[4];

Har förstått det så i böckerna jag läser/på forumet så blir lite kluven när läraren alltid refererar till att det heter vektor.

Iaf. Tror problemet ligger i main delen. Kanske deklarera familj[4] med bara ålder först sedan sortera och därmed lägga till namn? Men som sagt är verkligen ute på hal is atm. Håller tummarna för att få goda och bra råd från er erfarna sweclockers! Tack på förhand och hoppas jag uppförde mig och väl i mitt första "inlägg".

Varma hälsningar, Tobbe. PS. Ska lämnas in idag så snabba svar/råd är tas emot med öppen famn! Nu... Mot sängen!

Permalänk
Hedersmedlem

[QUOTE="Notion;15317732"]

if(p[i] == a) //Om p[i] är lika med sökt värde så returneras i. *****FEL: Operanden == no operator matching these operands. Antar ... if(p[j] > p[j+1]) //Om p[j] är större än p[j+1] flyttas p[j] till en temporär plats i temp för att sedan få sin rätta plats. *****FEL: Samma sak gäller här operanden fungerar inte.******

p[x] är här av typen Person, och det är oklart vad man menar om man försöker jämföra en Person med till exempel en int. Om det till exempel är åldern man är ute efter borde det stå
p[x].alder
istället.

Skrivet av Notion:

Först till en viktigt fråga för mig. Visst är familj[4] en array och inte en vector.

familj[4] är ett Person-objekt, men familj är en array (bestående av fyra Person-objekt (och för övrigt börjar man räkna med 0, så familj[4] är egentligen ogiltig; den sista är familj[3])). Och om man förväntas använda en vektor är det kanske vector som avses. Genom att inkludera <vector> kan man istället för
Person familj[4];
skriva
std::vector<Person> familj;

Permalänk
Medlem
Skrivet av Elgot:
Skrivet av Notion:

if(p[i] == a) //Om p[i] är lika med sökt värde så returneras i. *****FEL: Operanden == no operator matching these operands. Antar ... if(p[j] > p[j+1]) //Om p[j] är större än p[j+1] flyttas p[j] till en temporär plats i temp för att sedan få sin rätta plats. *****FEL: Samma sak gäller här operanden fungerar inte.******

p[x] är här av typen Person, och det är oklart vad man menar om man försöker jämföra en Person med till exempel en int. Om det till exempel är åldern man är ute efter borde det stå
p[x].alder
istället.

Och om man förväntas använda en vektor är det kanske vector som avses. Genom att inkludera <vector> kan man istället för
Person familj[4];
skriva
std::vector<Person> familj;

Åh här går det fort ser jag, hehe. Tack så hemskt mycket.
Ja men det verkar ju vettigt att det skall vara p[x].alder. Men då borde väl nästan det sättas in vid anropet av funktionen eller hur så själva familj[4].alder skickas till p[]?
Alltså i dessa:

bubblesort(familj, sizeof(familj))

&

linsok(familj, sizeof(familj), age);

Men då får jag felet, expression must have class type (Person familj[4])

Citat:

familj[4] är ett Person-objekt, men familj är en array (bestående av fyra Person-objekt (och för övrigt börjar man räkna med 0, så familj[4] är egentligen ogiltig; den sista är familj[3])).

Det här är ju precis vad jag menar. Min lärare måste gå på något för hen vet ju ingenting och sätter en annan riktigt på pottkanten.
För mig är den sista array:n [3] också men eftersom han skrivit att man skall använda: Person familj[4] så vart det snurr i bollen här
Någon mer än jag som tycker han är tvetydig när han använder [] men skriver i texten orden vektor hela tiden.

Har före detta gått mattekurser via Miroi(distans) och börjar nu inse att som vanligt så är allt som är kommunalt anlitat bara skit.

[QUOUTE]Och om man förväntas använda en vektor är det kanske vector som avses. Genom att inkludera <vector> kan man istället för
Person familj[4];
skriva
std::vector<Person> familj;

Ovan nämnda kändes mer rätt för mig med efter vad jag läst. Skall tilläggas att jag inte har "kursboken" då flera människor ansett den dålig så jag lade pengarna på en populär bok istället c++direkt av Jan Skansholm och c++ for dummies. Kanske var lite dumt då man förmodligen förstått frågorna bättre om man gjort kapitlen i boken. Men men blir ju en bredare utbildning anser jag nu
Skall försöka få det att fungera med men kan inte använda "familj[4].alder" i main heller då det står att alder at line 14 is inaccessible. Antar att det kan vara för att den ligger i class PRIVATE: ?

Dessa rader skall vara som dem är tydligen:
void bubblesort(Person p[], int n)
&
int linsok(Person p[], int n, int a)
(dessa har jag fått av läraren). Iofs så har jag inte så mycket tillit till lärarna längre

Tack för svaret ännu en gång. Synd det inte ledde någonstans. Funderar dock på att göra om den till en vektor och strunta i läraren. Förstod att jag varit lite otydlig med vad som var problemet då jag var trött men du verkar sett det ändå

Permalänk
Hedersmedlem
Skrivet av Notion:

Skall försöka få det att fungera med men kan inte använda "familj[4].alder" i main heller då det står att alder at line 14 is inaccessible. Antar att det kan vara för att den ligger i class PRIVATE: ?

Så är det. Dock har du ju funktionen get_alder() som inte är privat, så
p[x].get_alder()
löser nog problemet.

Permalänk

Först sågar du läraren för att du inte förstår sedan är det fel på boken. Hmm, kan felet ligga någon annanstans? Du säger själv att du inte har programmerat förut. Alla gör nybörjarmisstag. Övningarna är till för att du skall utsättas för problem och lära dig nya saker genom att lösa problem och uppnå förståelse.

1) Vi börjar med "alder at line 14 is inaccessible"-problemet. Det är helt korrekt att du inte kan komma åt en medlemen som är deklarerad private. Varför har du deklarerat åtkomstfunktioner?

2) Ordet "array" ingår inte i svenska språket. Normalt använder man "vektor" när man pratar om en "array". Detta har vi i Sverige gjort sedan långt innan C++ ens var påtänkt. Det är olyckligt att det sammanfaller med C++ template-klass "std::vector". Om du tyckte det var så konstigt att hen sade "vektor" när du tyckte att hen borde sagt "array", varför frågade du inte din lärare om det? Och nej, du skall inte använda std::vector istället för array. Det kommer inte att göra problemet lättare på något sätt.

3) I ditt försök till en bubblesort har du gjort samma misstag som i linjärsökningen: du behandlar dina Person-objekt som om de vore heltal. Har du kopierat en bubblesort för heltal? Jämförelsen if(p[j] > p[j+1]) jämför två Person-objekt. (Det kan man göra men då får du deklararera en jämförelseoperator för Person och det tror jag är överkurs. Att man kan ha en jämförelseoperator för Person förklarar det kryptiska felmeddelandet.) Ville du sortera på ålder? Sedan när du skall byta plats på två objekt in din vektor/array försöker du stoppa ett Person-objekt in ett heltal "temp = p[j];". (Om jag inte skriver det kommer någon som vill briljera med sin C++-kunskap säga att du skall använda std::swap och, ja, det skulle du kunna göra men det skulle inte hjälpa dig förstå att typerna måste stämma vid tilldelningar och jämförelser.)

Permalänk
Hedersmedlem
Skrivet av Ingetledigtnamn:

Normalt använder man "vektor" när man pratar om en "array".

Fält är en annan term om man vill undvika problemet.

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Först sågar du läraren för att du inte förstår sedan är det fel på boken. Hmm, kan felet ligga någon annanstans? Du säger själv att du inte har programmerat förut. Alla gör nybörjarmisstag. Övningarna är till för att du skall utsättas för problem och lära dig nya saker genom att lösa problem och uppnå förståelse.

1) Vi börjar med "alder at line 14 is inaccessible"-problemet. Det är helt korrekt att du inte kan komma åt en medlemen som är deklarerad private. Varför har du deklarerat åtkomstfunktioner?

2) Ordet "array" ingår inte i svenska språket. Normalt använder man "vektor" när man pratar om en "array". Detta har vi i Sverige gjort sedan långt innan C++ ens var påtänkt. Det är olyckligt att det sammanfaller med C++ template-klass "std::vector". Om du tyckte det var så konstigt att hen sade "vektor" när du tyckte att hen borde sagt "array", varför frågade du inte din lärare om det? Och nej, du skall inte använda std::vector istället för array. Det kommer inte att göra problemet lättare på något sätt.

3) I ditt försök till en bubblesort har du gjort samma misstag som i linjärsökningen: du behandlar dina Person-objekt som om de vore heltal. Har du kopierat en bubblesort för heltal? Jämförelsen if(p[j] > p[j+1]) jämför två Person-objekt. (Det kan man göra men då får du deklararera en jämförelseoperator för Person och det tror jag är överkurs. Att man kan ha en jämförelseoperator för Person förklarar det kryptiska felmeddelandet.) Ville du sortera på ålder? Sedan när du skall byta plats på två objekt in din vektor/array försöker du stoppa ett Person-objekt in ett heltal "temp = p[j];". (Om jag inte skriver det kommer någon som vill briljera med sin C++-kunskap säga att du skall använda std::swap och, ja, det skulle du kunna göra men det skulle inte hjälpa dig förstå att typerna måste stämma vid tilldelningar och jämförelser.)

Hej, för det första så säger jag inte att något är lärarens eller bokens fel. Det är ett som du förklarar det missförstånd av mig, men tycker du inte en pedagogisk lärare skulle noterat detta tidigare i sin skrift? På samma lätta och fina sätt som du nu gjort för mig.
Vet helt klart att mina begränsningar är stora då jag är nybörjare. Boken kritiserar jag inte utan bara det att det var kanske dumt av mig att ta en annan "större"/"tyngre" bok än kursboken då det säkert hade gått enklare att lösa dessa uppgifter med rätt bok. Tror dock att jag får lära mig lite mer då dessa är mer ingående dock kan det både hjälpa och stjälpa ibland har jag märkt. Mer att ta in och inte lika fokuserat för att kunna lösa just inlämningsuppgifterna.

1). Åtkomst funktionerna har jag deklarerat av säkerhetsskäl. Tycker inte informationen skall ligga public då det gäller namn och ålder på människor. Ser det som att det inte är lika lätt för en hacker att komma åt den privata delen. Förstod det så av vad jag läst mig till men sen om det är korrekt vet jag inte

2). Då är jag säker på att det är en array som skall användas iaf Tack.

3). Har tidigare gjort en funktion för att sortera tal och tog den för att försöka modifiera den. Vet även nu att det är p[i].alder; som gäller då jag har flyttat ut den till public istället för att försöka förenkla för mig själv. Vet inte om det gör någon nytta men man måste ju prova sig fram och nu får jag inga kodfel innan compilering iaf Efter compilering är en helt annan sak.

Jag förstår att jag inte kan sätta in objektet person i en array av int då den innehåller både string och int. Men fick dessa rader av läraren

void bubblesort(Person p[], int n)
&
int linsok(Person p[], int n, int a)
Sedan har jag bara försökt använda min lilla kunskap och försökt läst mig till hur jag skall lösa detta.

Det är just detta jag behöver hjälp med. Jag har dock kommit lite "längre" nu (vad jag tror iaf) än tidigare så koden ser ut såhär nu:

#include "stdafx.h" #include<iostream> #include<string> #include<vector> using namespace std; class Person { private: string namn; // Lägger dessa i privat för att det känns fel att ha denna information public. int alder; public: //Här innuti använder jag get/set för att enkelt kunna hämta/ange namn/ålder på eventuella personer. void skrivut() //Funktionen skrivut som kan anropas i samband med en person för att skriva ut informationen om denne person. Enligt cout nedan. { cout << "Personen /x84r " << alder << "/x86r gammal och heter " << namn << "." << endl; //Utskrift vid anrop av funktionen skrivut() } string get_namn() { return namn; } void set_namn(string set) { namn = set; } int get_alder() { return alder; } void set_alder(int set) { alder = set; } }; int linsok(Person p[], int n, int a)//Funktion för linjär sökning av ålder { for(int i=0;i<n;i++) //Söker igenom hela array:n. { if(p[i].get_alder() == a) //Om p[i] är lika med sökt värde så returneras i. { return i; } } return -1; //annars returneras -1. }; void bubblesort(Person p[], int n) //sorteringsalgoritm. { int i, j, funnen=1, temp; //Deklarerar de värden som krävs vid sorteringen for(i=0; i<=n-1 && funnen; i++) { funnen=0; for(j=0; j<n-1; j++) //Går igenom hela listan { if(p[j].get_alder() > p[j+1].get_alder()) //Om p[j] är större än p[j+1] flyttas p[j] till en temporär plats i temp för att sedan få sin rätta plats. { temp = p[j].get_alder(); p[j] = p[j+1]; p[j+1].get_alder() = temp; funnen = 1; //Loppen pågår tills dess att inget tal i arrayn behöver flyttas. } } } return; }; int main() { int age = 0; Person familj[4]; //Deklarerar array:n familj med 4 platser { Person pers1; //Familjemedlemmar skapas. Person pers2; Person pers3; Person pers4; pers1.set_alder(14); //Familjemedlem 1 blir tilldelad en ålder. pers1.set_namn("olof"); //Familjemedlem 1 blir tilldelad ett namn. pers1.skrivut(); //Familjemedlem 1's tilldelade ålder & namn skrivs ut. pers2.set_alder(6); pers2.set_namn("Lisa"); pers2.skrivut(); pers3.set_alder(37); pers3.set_namn("Lena"); pers3.skrivut(); pers4.set_alder(42); pers4.set_namn("Erik"); pers4.skrivut(); { familj[0] = pers1; //Tilldela varje person en plats i array:n. familj[1] = pers2; familj[2] = pers3; familj[3] = pers4; { bubblesort(familj, sizeof(familj)); //Anropar funktionen bubblesort för att sortera array:n familj[4]. { cout << familj <<endl; cout << "Ange en /x86lder att s/x94ka efter./n Avsluta med ENTER." << endl; //Skriver ut anvisningar till användaren cin >> age; //Låter användaren mata in åldern att söka efter. { linsok(familj, sizeof(familj), age); //Söker efter det angivna värdet och om detta hittas returneras det } } } } } system("PAUSE"); return EXIT_SUCCESS; }

Ingetledigtnamn: Jag är med dig hela vägen och du satte tummen på spiken. Förstår inte hur jag skall formulera mina funktioner för att dessa skall fungera för klasser. Alltså vad jag kan använda istället för temp för att förvara p[j] under tiden jag flyttar det andra. Min tanke är att spara det i p[10] för att sedan flytta tillbaka det men då skapar jag väl ett fält i p[10] som jag inte vet hur jag skall radera efteråt Samt att jag är rädd att om jag använder p[].get_alder när jag flyttar dem så kanske bara åldern flyttas och inte hela personens information dvs namnet.

Och sedan i sökfunktionen skall jag returnera ett int och vet inte hur jag skall formulera mig där. Kanske med return i; om det är rätt och -1 om det är fel. Men då skapa sett problem i main att jag inte vet hur jag gör för att vid -1 skriva ingen med den åldern finns i listan. Och vid i couta ut personen familj[i].

Kanske en if sats typ: if(linsok(familj, sizeof(familj), age)) cout << familj[linsok(familj, sizeof(familj), age)] <<endl;
Nu är jag verkligen ute på djup is känner jag haha.
else
cout << "Ingen person med den /x86ldern finns i listan." << endl;

Är oerhört tacksam för era svar hittills då dessa gett mig mer än boken gjort inom detta projekt.
Hoppas ni inte anser att jag vill ta en latmask igenom genom att be om hjälp. Jag behöver verkligen hjälpen. Känner att jag kört fast rejält och inte kan hitta informationen jag söker. Men det betyder inte att jag inte spenderar varje sekund då jag inte svarar på era svar till detta just nu.
Plus gör detta för att få en tjuvstart inför högskolestudier. Sjukt roligt med utmaningar men ibland lär man stanna och be om vägledning.
Tack på förhand!

Permalänk
Medlem
Skrivet av Elgot:

Fält är en annan term om man vill undvika problemet.

Hade varit att föredra, men men. Skulle haft tunnelseende och bara tittat på koden istället.

Permalänk
Medlem

Jaa! Tror jag är ännu närmare nu Visst fan borde jag göra en person av temp! likt detta.
Person temp = p[j];
p[j] = p[j+1];
p[j+1] = temp;
Då lär det ju fungera.

Kör för mig själv här men det är motivation att hålla igång när man får svar från folk iaf! Lite pikar om vad man är dålig på ingetledigtnamn
Tack för den, kollade närmare på det och har försökt göra en egen array där jag kunnat stoppa det innan men har inte tänkt på att det behövs ju ingen array bara en ny "person" i classen som inte sedan är med i "vektorn"

Permalänk
Medlem

Har inte riktigt tid att läsa igenom allt nu, men en sak som va tydlig;
Varför har du ingen konstruktor till Person? Då slipper du skriva set namn, ålder, whatever.

class Person{
public:
Person(std::string, int);
...
}

Person(std::string name, int age){
this->name = name;
this->age = age;
...
}

Så skriver du bara;
Person kalle = Person("Kalle", 25);

Sen förstår jag inte varför du har klamrar lite här o var.
O sist, ha engelska namn på variabler o saker, svenska e inte att föredra, oavsett om man inte använder åäö.

Kan kolla mer sen när jag kommer hem från kalaset:

Permalänk
Medlem
Skrivet av Pether:

Har inte riktigt tid att läsa igenom allt nu, men en sak som va tydlig;
Varför har du ingen konstruktor till Person? Då slipper du skriva set namn, ålder, whatever.

class Person{
public:
Person(std::string, int);
...
}

Person(std::string name, int age){
this->name = name;
this->age = age;
...
}

Så skriver du bara;
Person kalle = Person("Kalle", 25);

Sen förstår jag inte varför du har klamrar lite här o var.
O sist, ha engelska namn på variabler o saker, svenska e inte att föredra, oavsett om man inte använder åäö.

Kan kolla mer sen när jag kommer hem från kalaset:

Okej, nu är jag väldigt färsk på ämnet men hänger med, har inte kommit till pekare riktigt ännu och har inte gått igenom detta du nyss skrivit om. Ska kolla djupare på det då det förmodligen är kunskap jag skulle vilja ha haft nu. Har försökt lösa problemet med det jag kan och själva klassen fungerar ju så därför har jag inte tänkt mer över det.

Nu är det inte mycket kvar tror jag. Fast fastnar man så fastnar man

Har kvar själva anropet av funktionen linsok och sedan satsen för att skriva ut personen har skrivit dessa såhär just nu men då fungerar det ju dessvärre inte om man skriver fel.
Funktion:

int linsok(Person p[], int n, int a)//Funktion för linjär sökning av ålder { for(int i=0;i<n;i++) //Söker igenom hela array:n. { if(p[i].get_alder() == a) //Om p[i] är lika med sökt värde så returneras i. { return ; } } return -1; //annars returneras -1. };

Anropet atm:

if(linsok(familj, i, age)); //Söker efter det angivna värdet och om detta hittas returneras det { cout << "Den personen med s/x94kt /x86lder /x84r: " ; familj[linsok(familj, i, age)].skrivut(); }

Permalänk
Medlem
Skrivet av Notion:

1). Åtkomst funktionerna har jag deklarerat av säkerhetsskäl. Tycker inte informationen skall ligga public då det gäller namn och ålder på människor. Ser det som att det inte är lika lätt för en hacker att komma åt den privata delen. Förstod det så av vad jag läst mig till men sen om det är korrekt vet jag inte

Access modifiers har inget med säkerhet mot hackers att göra, det är inte därför man man gör fält privata och skapar åtkomstfunktioner. Det finns flera anledningar till det, men det handlar framförallt om att förenkla för sig själv. Implementationsdetaljer bör inte kunna påverkas av utomstående kod för då skapas beroenden vilket gör det svårare att få översikt på koden och kunna modifiera den senare. Om du programmerar mot en klass vill du i så stor utsträckning som möjligt kunna strunta i hur den är implementerad, du vill snarare se den som en liten svart låda som gör det den är till för. Det gör också att implementationen kan ändras i framtiden utan att kod som använder klassen påverkas. Nu är ålder en int, så du skriver kod som hanterar det som en int, men tänk om du i framtiden vill spara ålder som en float, eller kanske som ett datum? Accessar du ålder variablen direkt från annan kod kommer den koden sluta fungera då, har du däremot en "get ålder" funktion som returnerar en int kan helt enkelt den metoden skrivas om att konvertera åldern till en int, och ingen annan kod påverkas.

Rekommenderar att läsa på om Encapsulation för mer information om det hela.

Visa signatur

Fractal Design Define R5 | MSI Z97-GD65 Gaming | MSI Geforce GTX 970 Gaming 4G | Intel i5 4690k | Cooler Master Hyper 212 EVO | EVGA Supernova G2 750W | 2x8GB Corsair Vengeance Low Profile DDR3 1600Mhz | Samsung 850 EVO | Seagate 1TB SATA3.5

Permalänk
Skrivet av Notion:

Har kvar själva anropet av funktionen linsok och sedan satsen för att skriva ut personen har skrivit dessa såhär just nu men då fungerar det ju dessvärre inte om man skriver fel.
Funktion:

int linsok(Person p[], int n, int a)//Funktion för linjär sökning av ålder { for(int i=0;i<n;i++) //Söker igenom hela array:n. { if(p[i].get_alder() == a) //Om p[i] är lika med sökt värde så returneras i. { return ; } } return -1; //annars returneras -1. };

Anropet atm:

if(linsok(familj, i, age)); //Söker efter det angivna värdet och om detta hittas returneras det { cout << "Den personen med s/x94kt /x86lder /x84r: " ; familj[linsok(familj, i, age)].skrivut(); }

Seså, det tar sig

Ditt problem här är att if-satsen tolkar alla värden som inte är noll som sanna. Eftersom du returnerar -1 för "inte hittat" tolkas det som sant och man skriver ut person -1 (vilket kan få programmet att krascha).

PS. I linsok i retursatsen har du missat vilket du skall returnera (eller så blev det fel när du klippte in koden). DS.

Permalänk
Medlem

--- strykt kodstycke

Där har vi det allt fungerar som det ska skall posta. Tycker ni jag skall posta allt som helhet för att hjälpa någon annan eller gör vi inte så här? Tänkte så inte massa latmaskar googlar sig in till tråden.

Permalänk

Grattis!

Jag tror det är bäst att hålla det hemligt så länge

Nu när det funkar tycker jag att du skall se om det står något on konstruktorer i boken och fundera på om hur man skulle använda konstruktorer i din kodsnutt.

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Grattis!

Jag tror det är bäst att hålla det hemligt så länge

Nu när det funkar tycker jag att du skall se om det står något on konstruktorer i boken och fundera på om hur man skulle använda konstruktorer i din kodsnutt.

Det ska jag absolut kolla upp. Skall bara göra en binär sökfunktion nu men det har jag iaf bra koll på
Tack för tips, ledtrådar och motivation!

Permalänk
Medlem
Skrivet av Tobberoth:

Access modifiers har inget med säkerhet mot hackers att göra, det är inte därför man man gör fält privata och skapar åtkomstfunktioner. Det finns flera anledningar till det, men det handlar framförallt om att förenkla för sig själv. Implementationsdetaljer bör inte kunna påverkas av utomstående kod för då skapas beroenden vilket gör det svårare att få översikt på koden och kunna modifiera den senare. Om du programmerar mot en klass vill du i så stor utsträckning som möjligt kunna strunta i hur den är implementerad, du vill snarare se den som en liten svart låda som gör det den är till för. Det gör också att implementationen kan ändras i framtiden utan att kod som använder klassen påverkas. Nu är ålder en int, så du skriver kod som hanterar det som en int, men tänk om du i framtiden vill spara ålder som en float, eller kanske som ett datum? Accessar du ålder variablen direkt från annan kod kommer den koden sluta fungera då, har du däremot en "get ålder" funktion som returnerar en int kan helt enkelt den metoden skrivas om att konvertera åldern till en int, och ingen annan kod påverkas.

Rekommenderar att läsa på om Encapsulation för mer information om det hela.

Haha, där ser man. Man ska då inte tro på allt man läser på internet Men ibland får man ta och chansa. Skönt att ha allt avklarat till slut.
Jag skall absolut kolla in det du tipsar om all information är välkommen då jag börjar tycka programmering är roligare och roligare. Iaf när det väl släpper och man förstår det simpla man suttit och misslyckats med. Som sista if satsen hade bommat en krullparantes { så else satsen ville inte fungera. Tog ju bara 1 timme då man inte stött på problemet innan.

Kommer då inte göra samma fel igen, det är ju något positivt med det hela.

Ps. Väldigt bra forum skall nog hålla mig kvar här.

Permalänk
Medlem
Skrivet av Notion:

Okej, nu är jag väldigt färsk på ämnet men hänger med, har inte kommit till pekare riktigt ännu och har inte gått igenom detta du nyss skrivit om. Ska kolla djupare på det då det förmodligen är kunskap jag skulle vilja ha haft nu. Har försökt lösa problemet med det jag kan och själva klassen fungerar ju så därför har jag inte tänkt mer över det.

Fanns dock inget om pekare i mitt inlägg. Dock hade det varit en pekare du skapat ifall vi skrivit 'new' innan. Konstruktorer är väldigt basic, e det första du lär dig efter att man fått veta vad en klass är typ.

Permalänk
Medlem

Okok, ja som sagt har ju varit dum och skippat läroboken för jan skansholm's c++ direkt men jobbar för mycket för att orka/hinna läsa ikapp det dom läser 20 sidor om har jag 60+. Lite mer ingående vilket är bra men samtidigt lätt att vissa basic grejer faller bort och man tar upp mer avancerade grejer som kanske inte riktigt behövs ännu
Kan vara därför det tog lite tid innan jag fick ihop mitt program. Nu efteråt känns det ganska så lätt. Men det gör det väl alltid.