![]() |
[c++]classes
hallo,
ik heb een probleempje, ik ben bezig met c++ te leren uit een boek maar ik zit vast;(. CLASSES. nu hebben ze een (stukje van een)opgaven: Lees van af het totsenbord naam en leeftijd in van 10 personen. sla dit op in een array met 10 klasse objecten. voor elke naam wordt een beperkte ruimte gereserveert(31 bytes met 0karacter), dus namen langer dan 30, worden afgekapt. nu had ik dit gemaakt: //opdr 6.1 #include<iostream.h> class persoon { public: persoon(char pnaam[30]="...",int pleeftijd=0); //constructor ~persoon(){} //deconstructor void pprint()const; private: char *naam; int leeftijd; }; persoon::persoon(char pnaam[30],int pleeftijd) //initialisatie { naam=pnaam; leeftijd=pleeftijd; } void persoon::pprint() const { cout<<naam<<' '<<leeftijd<<endl; } int main() { persoon x[3]; char naam[30]; int leeftijd; for(int i=0;i<3;i++) { cout<<i+1<<" Naam: ";cin>>naam; cout<<" Leeftijd: ";cin>>leeftijd; x[i]=persoon(naam,leeftijd); } for(i=0;i<3;i++) { x[i].pprint(); } return 0; } ik weet dat de fout bij, de pointer zit. maar het boek is nogal vaag over die dingen dus zou iemand mij ff kunnen helpen???!! |
nou moet ik zeggen dat ik geen ervaring heb met de manier waarop jij data van en naar de tty stuurt maar iets waar ik aan dacht is: stel dat je een naam van 31 tekens invoert, ga je er dan vanuit dat dat afgekapt word omdat je array maar 30 elementen groot is?
als dat namelijk zo is dan zal het prog waarschijnlijk segfaulten bij 31 tekens wat weer een deur opent voor mogelijke exploits |
geef dan in ieder geval de foutmelding ff... ik ga het programma niet zelf uitvoeren.. geen zin in
|
Zo op de eerste blik ligt het denk ik aan de lifetime van pnaam.
[edit] Dat schijnt niet eens het probleem te zijn :/ Ik word ook dement :o Het echte probleem, waar normaal niemand bij stilstaat, zit hier: Code:
for(i=0;i<3;i++) Code:
for(int i=0;i<3;i++) x[i].pprint(); |
kerels, i is niet het probleem; i is wel bekent! kijk maar in mn code ik heb i in de eerste [for next loop] al gedeclareert. zou ik m nog ns declareren dan zou ik een foutmelding krijgen.
het ligt inderdaad aan die pointer, wat weet ik nog niet dat wou ik nou net ff weten. hij zou elke naam moeten opslaan en dat doet ie niet. Hij slaat alleen de laatste ingevoerde naam op en kent die aan de rest. volgensmij is n klein foutje ergens. ik krijgtrouwens geen foutmeldingen. |
Citaat:
Citaat:
Maar het probleem is duidelijk. 'naam=pnaam' wijst aan de pointer 'naam' het geheugen adres van de variabele 'pnaam' toe. Deze heeft in de machinecode een vaste geheugenplaats gekregen, ter optimalisatie van de uitvoering. Hierdoor overschrijf je steeds hetzelfde adres, en zijn alle namen gelijk. Leuk he? :p Snelle oplossing: vervang de pointer gewoon door een array en werk met strcpy. Minder snelle oplossing: werk met 'new' en 'delete' om je pointers naar apart gereserveerde geheugenplaatsen te laten wijzen. Succes! |
yo bedankt, en als ik voor de tweede i een int zet krijg ik een error:
D:\Cpp\6_1\main.cpp(40) : see declaration of 'i' en laat ik t weg doet i t gewoon. ligt misschien aande compiler. |
hier is ie af(nouja mn probleempje gefixed.):
//opdr 6.1 #include<iostream.h> #include<string.h> class persoon { public: persoon(char naamPersoon[30]="...",int pleeftijd=0); //constructor ~persoon(){} //deconstructor void pprint()const; private: char naam[30]; int leeftijd; }; persoon::persoon(char naamPersoon[30],int pleeftijd) //initialisatie { strcpy(naam,naamPersoon); leeftijd=pleeftijd; } void persoon::pprint() const { cout<<naam<<' '<<leeftijd<<endl; } int main() { persoon x[3]; char naam[30]; int leeftijd; for(int i=0;i<3;i++) { cout<<i+1<<" Naam: ";cin>>naam; cout<<" Leeftijd: ";cin>>leeftijd; x[i]=persoon(naam,leeftijd); } for(i=0;i<3;i++) { x[i].pprint(); } return 0; } |
Alle tijden zijn GMT +1. Het is nu 04:25. |
Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.