CanTBeaTme
Banned
- Lid geworden
- 25 jul 2006
- Berichten
- 235
Ik krijg dit (gecompileerd met g++):
Code:Is uw figuur 2D of 3D? [2/3] 2 Geef de lengte: a Geef de breedte: 1 van de maten is kleiner dan 1 en is bijgevolg niet geldig
Nu zijn mijn vragen:
Code:1) Waarom laat ie me niet eerst de breedte ingeven en dan pas die controle? Hij stopt midden in de functie eigenlijk om de volgende al te beginnen. Kan je even uitleggen?
vraag ik me ook af ,sorry
Code:2) Als je met OOP werkt, moet je dan wat anders omgaan met pointers?
niet bepaald. een pointer naar een class kan ook ,net zogoed als een pointer naar een
int char float of welk type dan ook.
Code:3) Kan je de operators new en delete even uitleggen? Ik zag die in classes, maar wat doen ze?
new en delete alloceren en dealloceren dynamisch geheugen.
als je bijvoorbeeld in een programma een array hebt, waar een naam in moet komen van een "gebruiker" je weet zelf niet hoegroot de array zal moetten zijn, doe je array[10]
heb je de kans dat er teweinig plaats is en dan crashed je programma, doe je array[40]
dan heb je de kans dat een groot deel van die gereserveerde plaatsen niet gebruikt gaan worden, dan verbruik je geheugen zonder dat je er iets mee doet. met new en delete voorkom je dat, new en delete reserveren geheugen tijdens runtime in de heap ( vrije ram)
en als ze er klaar mee zijn (ergens in het programma als je zijn naam niet meer nodig hebt) dan kan je die terug geven als vrij geheugen.
eigenlijk is een string een char array die dynamisch gealloceerd is met als laatste het '\0' teken, dat duid op het einde van de string.
bv, string x;
cin >> x;
( je kan zoveel letters typen als je wil, tot je geheugen op is natuurlijk. een char is 1 byte een string is een character array, een computer met 512 mb dus kan jij, 512 000 000 letters typen ( natuurlijk lopen er op je computer nog programmas die elk ook geheugen verbruiken, dus het zal nooit zoveel zijn )
doe je nu , string x = "hallo" , dan heb je de grote van je string al bepaalt die is 6 bytes groot ( vergeet de '\0' niet )
![]()
doe je nu , cin >> x; en je geeft meer als 5 letters in dan overschrijf je data buiten de array! wat dus in ernstige systeemfouten kan uitlopen, stel dat de geheugenplaats achter jou string nou net gebruikt word door één of ander systeemprocces, en jij overschrijft die dan gaat dat systeemprocces crashen, en je computer misschien ook
een voorbeeldje van hoe dat je new kunt gebruiken.
stel dit voor als een programma op de server van je school, die leerlingengegevens bijhoud, je school heeft dit programma pas gekocht en wilt nu zijn 1400 leerlingen ingeven in het systeem, als je nu een array gebruikt , hoegroot moet die dan zijn? evengroot als het aantal leerlingen, weet jij al hoeveel leerlingen er op de school zijn?
neen, ideaal dus voor dit dynamisch op te lossen met new
Code:#include <iostream> using std::cout; using std::endl; using std::cin; using std::getline; class student { static int leerlingennummer; const int leerling; public: student() : leerling(leerlingennummer) { ++leerlingennummer; } int id() const; }; int student::leerlingennummer = 1; int student::id() const { return leerling; } int main () { int i = 0; cout <<"hoeveel leerlingen zijn er?" << endl; cin >> i; student *pointer = new student [i]; // wij willen i aantal studenten! (dit is een array van "i" studenten groot) // zou je hier een gewone array voor gebruiken geeft je compiler een fout. for (int x = 0; x < i; x++) { cout << (pointer[x]).id()<<"\t"; // geef het nummer van elk student if ( (pointer[x]).id()%10 == 0) // lege lijn na 10 studenten { cout << "\n"; } } //als je deze leerlingen of één van de leerlingen niet meer nodig hebt: delete [] pointer; // geeft alle ruimte gebruikt terug aan als vrij geheugen // dus alle "i" leerlingen worden gewist // nu zie je al dat dit voor een memory leak kan zorgen, stel dat iemand bijv // 700000000000000000000000000000000000 voor "i" ingeeft, en je pc // heeft daar niet genoeg plaats voor, boem, crash cin.get(); return 0; }
Code:4) Heb ik nu pointers onder de knie of moet ik nog veel leren voor ik die pointers goed zal kunnen?
dat weet ik niet, dat zou jij moetten weten![]()
Code:5) Ik kan string.h niet gebruiken omdat g++ alles haalt uit: /usr/include/c++/4.1.2/backward/ Maar string (zonder .h) en andere staan in deze dir: /usr/include/c++/4.1.2/ Maar in /usr/include/c++/4.1.2/backward/ staan er dan als: "algobase.h" en "algo.h" die in /usr/include/c++/4.1.2/ niet staan.
geen idee.. ik gebruik g++ niet
Hoe los ik dit allemaal op?
Code:6) De .h bestanden die je zelf schrijft, waarvoor dienen die? Waarom kan dat niet in die .cpp? Bijna elk .cpp bestand heeft een gelijknamig .h bestand, waarvoor is dat goed?
deze bestanden (.h) zorgen voor orde en overzicht . je kan bijvoorbeeld je class en zijn functie prototypen in een .h bestand typen en de "body" de code tussen de { } in een .cpp
file schrijven, dan zet je in je .cpp file #include "file.h" en in je main.cpp zet je dan
#include "file.h"
Ook zorg je er zo voor dat je dit bestand (class) terug kunt gebruiken in andere programmas! door deze te includen
dit zorgt ook voor veiligheid, als je bijvoorbeeld samen met iemand anders een programma schrijft , en hij wil niet zijn functie code laten zien, alleen hetgeen wat zijn functies nodig hebben (parameters) dan kan hij jou bijvoorbeeld het .h bestand sturen, waar alle prototypes van functies instaan, en zonder dat jij weet hoe de functie omgaat met de data kan jij er toch verder aan programmeren.
Laatst bewerkt: