Help - Zoeken - Gebruikers - Kalender
Volledige versie: C++ newbie vraag
MandrivaClub.NL > Forum > Documentatie en Programmeren
Kaneda
Okay, heb dus lessen c++ maar daar werken we met Borland6 nogiets.
Nu wilde ik thuis werken aan een code die ik op school gemaakt had en werkte, maar hier onder linux/gcc-cpp doet hij het niet. Nu heb ik wel gehoord dat borland kuren heeft, maar ik zie zo snel niet waar de fout in zit. Waarschijnlijk heel makkelijk maar ik ben nog c++-newbie blush.gif , so be gentle:


#include <iostream>
#include <iomanip>
using namespace std;

class Tijdsduur {
public:
Tijdsduur(int t);
Tijdsduur(int t, int m);
void print();
void maal(int t);
void erbij(const Tijdsduur& t);
void eraf(const Tijdsduur& t);
private:
int uur;
int min;
};// Definieer hier het ADT Tijdsduur

Tijdsduur::Tijdsduur(int t):uur(0),min(t){
}
Tijdsduur::Tijdsduur(int t, int m):uur(t),min(m){
}

void Tijdsduur::print(){
while (min<0) {
      min+=60;
      uur-=1;
   }
   while (min>59) {
      min-=60;
      uur+=1;
   }
cout<<uur<<" uur en "<<min<<" minuten";
}

void Tijdsduur::maal(int t){
min=min+60*uur;
uur=0;
min=t*min;
while (min<0) {
      min+=60;
      uur-=1;
   }
   while (min>59) {
      min-=60;
      uur+=1;
   }
}

void Tijdsduur::erbij(const Tijdsduur& t){
   min=min+t.min;
   uur=uur+t.uur;
      while (min<0) {
      min+=60;
      uur-=1;
   }
   while (min>59) {
      min-=60;
      uur+=1;
   }

   }

void Tijdsduur::eraf(const Tijdsduur& t){
   min=min-t.min;
   uur=uur-t.uur;
      while (min<0) {
      min+=60;
      uur-=1;
   }
   while (min>59) {
      min-=60;
      uur+=1;
   }


}

int main() {
        Tijdsduur t1(3,50);         // t1 is 3 uur en 50 minuten
        cout<<"t1 = "; t1.print(); cout<<endl;
        const Tijdsduur kw(15);     // kw is 15 minuten
        cout<<"kw = "; kw.print(); cout<<endl;
        t1.erbij(kw);               // Tel kw bij t1 op
        cout<<"t1 = "; t1.print(); cout<<endl;
        Tijdsduur t2(t1);           // t2 is een kopie van t1
        t2.eraf(kw);                // Trek kw van t2 af
        cout<<"t2 = "; t2.print(); cout<<endl;
        t2.maal(7);                 // Vermenigvuldig t2 met 7
        cout<<"t2 = "; t2.print(); cout<<endl;
        Tijdsduur t3(3,-122);       // t3 is 3 uur minus 122 minuten
        cout<<"t3 = "; t3.print(); cout<<endl;
        Tijdsduur t4(3,122);        // t4 is 3 uur plus 122 minuten
        cout<<"t4 = "; t4.print(); cout<<endl;
        cout<<"Druk op de return-toets."<<endl;
        cin.get();
        return 0;
}


error:


[user@localhost Documenten]$ gcc opdrach2a.cpp -o hoi
opdrach2a.cpp: In function ‘int main()’:
opdrach2a.cpp:82: error: passing ‘const Tijdsduur’ as ‘this’ argument of ‘void Tijdsduur::print()’ discards qualifiers


Alvast bedankt! icon_idea.gif
davo
De error heeft denk ik te maken met het feit dat je const Tijdsduur kw(15) omgezet wordt naar een Tijdsduur::TIjdsduur(int t) die geen const is.
Als je Tijdsduur::print() aanroept gebeurt dit hierboven en geeft een error.
Als je Tijdsduur::eraf() aanroept, dan is het argument een void Tijdsduur::eraf(const Tijdsduur& t), dus een const Tijdsduur t, precies wat kw(15) is, en dat zal wel lukken.

Mogelijke oplossing? je kw.print() casten naar een gewone tijdsduur:

const Tijdsduur kw(15); // kw is 15 minuten
cout<<"kw = ";Tijdsduur(kw).print(); cout<<endl;

Bij mij werkt dit echter niet (gcc 4.1.1), want ik krijg een hele hoop rotzooi errors met nogal wat hex codes.

Ik weet dus niet of mijn mogelijke oplossing slecht is, of dat gcc of iets anders op mijn installatie niet in orde is...
davo
Hoi, ik heb nog eens zitten rommelen in je code en heb het volgende gemaakt:

#include <iostream>

using namespace std;

class Tijdsduur {
public:
Tijdsduur(int t){
    uur=0;
    min=t;
};
Tijdsduur(int t, int m){
    uur=t;
    min=m;
};
void print();
void maal(int t);
void erbij(const Tijdsduur& t);
void eraf(const Tijdsduur& t);
private:
int uur;
int min;
};// Definieer hier het ADT Tijdsduur

void Tijdsduur::print(){
while (min<0) {
      min+=60;
      uur-=1;
   }
   while (min>59) {
      min-=60;
      uur+=1;
   }
cout<<uur<<" uur en "<<min<<" minuten";
}

void Tijdsduur::maal(int t){
min=min+60*uur;
uur=0;
min=t*min;
while (min<0) {
      min+=60;
      uur-=1;
   }
   while (min>59) {
      min-=60;
      uur+=1;
   }
}

void Tijdsduur::erbij(const Tijdsduur& t){
   min=min+t.min;
   uur=uur+t.uur;
      while (min<0) {
      min+=60;
      uur-=1;
   }
   while (min>59) {
      min-=60;
      uur+=1;
   }

   }

void Tijdsduur::eraf(const Tijdsduur& t){
   min=min-t.min;
   uur=uur-t.uur;
      while (min<0) {
      min+=60;
      uur-=1;
   }
   while (min>59) {
      min-=60;
      uur+=1;
   }


}

int main() {
        Tijdsduur t1(3,50);         // t1 is 3 uur en 50 minuten
        cout<<"t1 = "; t1.print(); cout<<endl;
        const Tijdsduur kw(15);     // kw is 15 minuten
        Tijdsduur nonconstkw = const_cast<Tijdsduur&>(kw); // strips qualifier
        cout<<"kw = "; nonconstkw.print(); cout<<endl;
        t1.erbij(kw);               // Tel kw bij t1 op
        cout<<"t1 = "; t1.print(); cout<<endl;
        Tijdsduur t2(t1);           // t2 is een kopie van t1
        t2.eraf(kw);                // Trek kw van t2 af
        cout<<"t2 = "; t2.print(); cout<<endl;
        t2.maal(7);                 // Vermenigvuldig t2 met 7
        cout<<"t2 = "; t2.print(); cout<<endl;
        Tijdsduur t3(3,-122);       // t3 is 3 uur minus 122 minuten
        cout<<"t3 = "; t3.print(); cout<<endl;
        Tijdsduur t4(3,122);        // t4 is 3 uur plus 122 minuten
        cout<<"t4 = "; t4.print(); cout<<endl;
        cout<<"Druk op de return-toets."<<endl;
        cin.get();
      cout << "Hello World!" << endl;
        return 0;
}


Ten eerste heb ik je constructors in de class zelf gezet, en uitgeschreven ipv de shorthand die jij gebruikte, maar dat maakt eigenlijk niet uit. Ik ben zelf nog nieuw met C++, en deed dit om te zien of ik het wel goed begreep.

Ik was juist met dat const probleem. Maar ipv wat ik voorstelde dien je het zo te doen:

const Tijdsduur kw(15);     // kw is 15 minuten
Tijdsduur nonconstkw = const_cast<Tijdsduur&>(kw); // strips qualifier
cout<<"kw = "; nonconstkw.print(); cout<<endl;


dus met een const_cast... De qualifier const wordt weggehaald en je houdt een gewoon Tijdsduur object (nonconstkw) over. De print() functie werkt enkel hierop, en niet op een const Tijdsduur, immers in print() ga je t en min eventueel wijzigen, en dat zou in een const Tijdsduur dus niet kunnen.
De andere functies vragen wel een const Tijdsduur, daarom mag je wel kw doorgeven.


Wat nu heel erg vreemd is:

Als ik

gcc bestand.cpp -o bestand.exe

geef, dan krijg ik een hoop rotzooi, en een error exit.

Als ik echter
c++ bestand.cpp -o bestand.exe

geef, dan krijg ik netjes een .exe (ja ik ben op het werk ;).gif bezig, vandaar op windows) en doet wat het moet. Zie hieronder de output.

t1 = 3 uur en 50 minuten
kw = 0 uur en 15 minuten
t1 = 4 uur en 5 minuten
t2 = 3 uur en 50 minuten
t2 = 26 uur en 50 minuten
t3 = 0 uur en 58 minuten
t4 = 5 uur en 2 minuten
Druk op de return-toets.

Dus alles is ok.

Als ik
cpp bestand.cpp -o bestand.exe

Dan krijg ik wel een exe file, maar die wordt niet correct uitgevoerd.


Conclusie: de code zoals ze hier staat werkt. Er is nu wel nog een compiler probleem. c++, cpp en gcc geven een verschillende output: werkende exe, slechte exe, geen exe met error...

Nu ben ik geen compiler specialist, dus ik weet niet waaraan dit ligt. Ik dacht dat alle 3 hetzelfde waren (een MinGW installatie in windows), maar niet dus. Vermoedelijk moet ik nog flags of zo meegeven aan sommige compilers, maar dat zal ik later eens moeten uitzoeken...

Weet iemand raad?
davo
Gefunden: (http://doc.nl.linux.org/guide/lfs-nl/chapter06/gcc.html)

cc, cc1, cc1plus, gcc

Dit zijn C-compilers. Een compiler zet broncode om in tekstformaat naar een formaat dat een computer begrijpt. Nadat een broncodebestand is gecompileerd in een objectbestand, zal een linker een uitvoerbaar bestand van één of meer van deze met de compiler gegenereerde objectbestanden maken.


c++, cc1plus, g++

Dit zijn de C++ compilers, het equivalent van cc en gcc, enz.


c++filt

De C++ taal voorziet in function overloading, wat betekent dat het mogelijk is veel functies met dezelfde naam te schrijven (op voorwaarde dat elk parameters van verschillende types accepteert). Alle C++ functienamen worden gecodeerd in een low-level assembly label (dit proces staat bekend als mangling). Het programma c++filt doet het omgekeerde: het decodeert (demangles) low-level namen in namen op gebruikersniveau zodat de linker kan voorkomen dat deze overloaded functies met elkaar botsen.


collect2

collect2 assisteert bij de compilatie van constructors.


cpp, cpp0 (de preprocessor...)

cpp verwerkt een bronbestand voor, zoals het opnemen van de inhoudvan headerbestanden in het bronbestand. Voeg simpelweg een regel toe, zoals #include <bestandsnaam>, aan je bronbestand. De preprocessor zal de inhoud van het include bestand opnemen in het bronbestand.



Dus, het moet c++ zijn. En dat is ook deze die werkt...! jippie!
Dit is een "Print" versie van onze forums. Om de volledige versie met meer informatie, afbeeldingen en opmaakte bekijken, a.u.b. klik hier.