[C++] Methoden geven foute resultaten

Pagina: 1
Acties:

  • Darius
  • Registratie: Juli 2001
  • Laatst online: 16-09 19:19
Greetings,

Heb volgende programma geschreven voor opdracht op school maar ben volgens mij iets stoms vergeten.

deBestelling.geefDoorWit() en deBestelling.geefDoorBruin() geven niet de juiste waardes weer.

Kan wel goed met C om maar mijn C++ is nog niet zo goed. Anyway, het programma :

===============

#include "Bestelling.h"
#include "Bon.h"
#include <iostream>
using namespace std;

void main() {
Bestelling bestelling1(5,1.00,4.50,5,0.90,4.00);
Bestelling bestelling2(10,1.05,7.50,4,1.10,3.40);
Bon bon1(bestelling1), bon2(bestelling2);

bestelling1.getAantal();
bon1.printBon();
cout << endl << "Druk op enter om te stoppen";
while (cin.get() != 'd')
cin.get();
}

===========================

//---------------------------------------------------------------------------

#ifndef BestellingH
#define BestellingH
//---------------------------------------------------------------------------

class Bestelling {

private:
int aantalWit;
int aantalBruin;
int aantalWitKorting;
int aantalBruinKorting;
double prijsBruin;
double prijsWit;
double prijs5Wit;
double prijs5Bruin;
public:
Bestelling(int aantalWitKorting, double prijsWit, double prijs5Wit, int aantalBruinKorting, double prijsBruin, double prijs5Bruin);
getAantal();
double bereken();
int geefDoorBruin();
int geefDoorWit();
};


#endif

=======================

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Bestelling.h"
#include <iostream.h>

//---------------------------------------------------------------------------

#pragma package(smart_init)

Bestelling::Bestelling(int aantalWitKorting, double prijsWit, double prijs5Wit, int aantalBruinKorting, double prijsBruin, double prijs5Bruin)
{
this -> aantalWitKorting = aantalWitKorting;
this -> prijsWit = prijsWit;
this -> prijs5Wit = prijs5Wit;
this -> aantalBruinKorting = aantalBruinKorting;
this -> prijsBruin = prijsBruin;
this -> prijs5Bruin = prijs5Bruin;
}

Bestelling::getAantal()
{
cout << "Hoeveel Witte broodjes wilt U ?";
cin >> aantalWit;
cout << endl << "Hoeveel Bruine broodjes wilt U ?";
cin >> aantalBruin;
}

double Bestelling::bereken()
{ int tempWit, tempBruin, restWit, restBruin;
double totaalWit, totaalBruin;
tempWit = aantalWit%aantalWitKorting;
restWit = aantalWit-tempWit;
totaalWit = tempWit*prijsWit + restWit/5*prijs5Wit;
tempBruin = aantalBruin%aantalBruinKorting;
restBruin = aantalBruin-tempBruin;
totaalBruin = tempBruin*prijsBruin + restBruin/5*prijs5Bruin;
return (totaalWit+totaalBruin);
}

int Bestelling::geefDoorWit()
{
cout << "Beta " << aantalWit;
return aantalWit;
}

int Bestelling::geefDoorBruin()
{
return aantalBruin;
}

========================

#include "Bestelling.h"
//---------------------------------------------------------------------------

#ifndef BonH
#define BonH
//---------------------------------------------------------------------------

class Bon {

private:
Bestelling deBestelling;
public:
Bon(Bestelling deBestelling);
printBon();
};

#endif

================================

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Bon.h"
#include <iostream.h>

//---------------------------------------------------------------------------

#pragma package(smart_init)

Bon::Bon(Bestelling deBestelling):deBestelling(deBestelling)
{}

Bon::printBon()
{
cout << "Aantal Wit: " << deBestelling.geefDoorWit() << endl;
cout << "Aantal Bruin: " << deBestelling.geefDoorBruin() << endl;
cout << "Totaal : " << deBestelling.bereken() << endl;
}

==============================

Weet zeker dat het iets dom is. Wie kan mij helpen ? (PLEEEASE)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:17

.oisyn

Moderator Devschuur®

Demotivational Speaker

DUIDELIJKE topictitel aub

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ik heb je topictitel maar even verbeterd "Iets stoms" vond ik een beetje stom.

En formuleer je vraag ook even een stuk duidelijker ajb.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:01
Wat geven ze dan weer en wat moeten ze teruggeven?

https://fgheysels.github.io/


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:17

.oisyn

Moderator Devschuur®

Demotivational Speaker

het zit m denk ik hier
code:
1
2
Bon::Bon (Bestelling deBestelling) : deBestelling(deBestelling)
{}

hier gebruik je een ambigue naam, want deBestelling is zowel een classmember als een functie parameter

dus even de naampjes veranderen, bijvoorbeeld
code:
1
2
3
Bon::Bon (Bestelling bestelling) : deBestestelling (bestelling)
{
}

een kleine toelichting: wat dus bij je eigen code gebeurt is je initialiseert de functieparameter met zichzelf, waardoor de classmember deBestelling ongeinitializeert blijft (of tenminste, de default constructor wordt aangeroepen), waardoor de waarden die je later gebruikt niet kloppen

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Darius
  • Registratie: Juli 2001
  • Laatst online: 16-09 19:19
Op het laatst drukt ie het volgende af :

Aantal Witte Broodjes : 0
Aantal Bruine Broodjes : 0
Totaal : 0

Ik heb het verander maar ik krijg nog steeds dezelfde waarde. Als ik de functies geefDoorWit/Bruin onder main{} worden wel de goeie waardes doorgegeven. Ik gebruik Borland Cbuilder5. Weet iemand wat het nog meer zou kunnen zijn ?

BTW Sorry voor de titel, zal het nooit meer doen
BTW++ Bedankt voor de replies. Ik weet dat dit allemaal saai en flauw is. :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:17

.oisyn

Moderator Devschuur®

Demotivational Speaker

effe de code gekoppiepeest naar mijn visual C++, en ik heb de fout ontdekt :)

Je maakt eerst een bon van de bestelling
daarna vraag je de aantallen. Daar wordt dus alleen bestelling1 gewijzigd, maar bon1 niet, want die heeft een kopie van de bestelling toen je m maakte

Wat jij waarschijnlijk wilt is dat die Bon eigenlijk linkt naar de juiste bestelling ipv dat ie zijn eigen kopie heeft. Dan moet je het op gaan lossen met pointers:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Bon
{   
private:
    Bestelling * deBestelling;
public:
    Bon (Bestelling * deBestelling);
    printBon();
};

Bon::Bon (Bestelling * pBestelling) : deBestelling (pBestelling)
{
}

Bon::printBon()
{
    cout << "Aantal Wit: " << deBestelling->geefDoorWit() << endl;
    cout << "Aantal Bruin: " << deBestelling->geefDoorBruin() << endl;
    cout << "Totaal : " << deBestelling->bereken() << endl;
}

en natuurlijk niet dat regeltje in je main veranderen in
code:
1
    Bon bon1 (&bestelling1), bon2 (&bestelling2);

Ik hoop dat dit duidelijk is (je kent C, dus ik neem aan dat je ook weet hoe pointers werken)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Darius
  • Registratie: Juli 2001
  • Laatst online: 16-09 19:19
Hij doet het. Thanks B-) Wou het zoveel mogelijk Object georienteerd doen, maar pointers roelen toch.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:17

.oisyn

Moderator Devschuur®

Demotivational Speaker

pointers doen niets af aan OO hoor

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Op dinsdag 27 november 2001 01:43 schreef OiSyN het volgende:
pointers doen niets af aan OO hoor
Yup.

* Korben wijst naar sig...

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op maandag 26 november 2001 22:37 schreef OiSyN het volgende:
het zit m denk ik hier
code:
1
2
Bon::Bon (Bestelling deBestelling) : deBestelling(deBestelling)
{}

hier gebruik je een ambigue naam, want deBestelling is zowel een classmember als een functie parameter
Geen enkele "deBestelling" is ambigue. De eerste is de
parameternaam, daar zijn de members niet in scope. De tweede, achter de :, slaat altijd op een member. De derde is het meest ingewikkeld, maar dit staat duidelijk in de standaard. Method parameters verbergen members, dus deBestelling slaat in het laatste geval op de parameter, zoals bedoeld.

Dit is een standaard truc, als je geen zin hebt om parameternamen te verzinnen.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:17

.oisyn

Moderator Devschuur®

Demotivational Speaker

hmmm dat 2e wat je zei wist ik niet, ik gebruik altijd gewoon een andere naam om onduidelijkheden te voorkomen :)

(dat de parameter declaratie zelf niet ambigue is is natuurlijk logisch)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Darius
  • Registratie: Juli 2001
  • Laatst online: 16-09 19:19
Dus met andere woorden (zoals ik het begrepen heb) is dat hetzelfde als

this deBestelling -> deBestelling
Pagina: 1