Salve a tutti, avrei un dubbio riguardo questa classe che dovrebbe emulare un dado e il suo relativo main
Main:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include "dado.h"
#define MAX_LANCI 10000000
#define LANCIO_BUONO 3
#define SEQ 10
using namespace std;
int main()
{
Dado d;//creo istanza di Dado
long int c=0;
int i = 0;
srand(time(0));
while (i++<MAX_LANCI && c<SEQ)
{
//uno o due lanci
//si vince quando
d.effettuaLancio();
if (d.getUltimoLancio() == LANCIO_BUONO)
c++;
else{
//cout << d.getUltimoLancio() << endl;
c=0;
}
}
cout << "Tot Lanci=" << (c==SEQ ? i : i-1) << ", c=" << c << endl;
cout << (c==SEQ ? "Hai vinto" : "Non hai vinto") << endl;
}
Mentre questo codice riguarda la classe dado:
#include <iostream>
#include <cstdlib>
#include "dado.h"
#include <ctime>
Dado::Dado()
{
srand(time(0)); // usa un seme di default
effettuaLancio();
}
Dado::Dado(time_t seed) // il costruttore ha lo stesso nome della classe
{
srand(seed);
effettuaLancio();
}
void Dado::effettuaLancio ()
{
valoreUltimoLancio = //accesso ad una variabile che rappresenta parte dello stato dell'oggetto
(short) (1 + rand()%6);
}
short int Dado::getUltimoLancio () const
{
//commentaLancio(); metodo const, invocazione ok
//valoreUltimoLancio = (1 + rand()%6); // non permesso
//effettuaLancio(); // metodo non const, invocazione non permessa
return valoreUltimoLancio;
}
ostream &operator<< (ostream &stream, Dado d)
{
stream << "Il dado attualmente presenta la faccia "
<< d.getUltimoLancio() << ".\n";
return stream;
}
e infine qui c'è header
#ifndef DADO_H //Se DADO_H non è definito. Serve per evitare di richiamare 2 volte lo stesso header (incluso in più file cpp) e quindi evitare un errore di ridefinizione.
#define DADO_H //definisci DADO_H altrimenti salta a endif
#include <string>
using namespace std;
class Dado {
public: //***************************
Dado();
Dado (time_t seed);
//Cosa significa const dopo la dichiarazione del metodo?
//getUltimoLancio() NON potra' contenere codice che "modifica" oggetto
//istanza di dado
short int getUltimoLancio() const;
void effettuaLancio();
void commentaLancio() const; // anche questo e' const
friend ostream &operator<< (ostream &stream, Dado d); //overloading operatore '<<'
private: //***************************
short int valoreUltimoLancio; //membro privato, accessibile solo dal codice dei metodi della classe
}; // end class Dado
#endif
La mia domanda riguarda la classe dado in particolare questi costruttori:
Dado::Dado()
{
srand(time(0)); // usa un seme di default
effettuaLancio();
}
Dado::Dado(time_t seed) // il costruttore ha lo stesso nome della classe
{
srand(seed);
effettuaLancio();
}
come mai vi sono due costruttori?
Se il primo costruttore Dado::Dado() setta il seme e richiama la funzione lancio il secondo cosa fa?