Newsgroup: it.comp.lang.c++
Titolo: semplice Classe

Sto leggendo il libro di Soustrup ( si scrive cosi?) e siccome è fotocopiato
e mi manca l'intestazione non ci giurerei al 100% che è proprio questo!
Cmq mettiamo che sia giusto, allora sono arrivato finalmente al cap 10 sulle
classi.
Ho scritto la classe che lui fornisce come esempio, Date, ma mi sorgono
diversi problemi:
------------------------- VC++ 6 ---------------------------------------
#include <string.h>
class Date {
public:  enum Month { jan = 1, feb, mar, apr, may, jun, jul, aug, sep, oct,
nov, dec };
 class Bad_date { };  // per la gestione delle eccezioni
 Date(int dd=0, Month mm = Month(0), int yy=0);  // 0 significa "scegli il
     // valore di default"
 // funzioni per esaminare la data
 int day() const;     // restituisce il giorno
 Month month() const; // restituisce il mese
 int year() const;    // restituisce l'anno
 string string_rep() const; // sotto forma di stringa  <-- mi segnale
errore, string non è un tipo valido!
 void char_rep(char s[]) const;  // stringa stile C
 static void set_default(int,Month,int);  // pone la data di default
 // funzioni per cambiare la data
 Date& add_year(int n);  // aggiunge n anni
 Date& add_month(int n); // aggiunge n mesi
 Date& add_day(int n);   // aggiunge n giorni
private:
 int d,m,y;
 static Date default_date;
};
----------------------------------------------------------------------------
---
quindi nell'implementazione per vedere il giorno scrivo:
inline int Date::day() const { return d; }  // OK
ma per vedere il mese? ho provato con:
Date::Month Date::month() const { return m; }
error: cannot convert from 'const int' to 'enum Date::Month'
ovvero non so come restituire un enum senza che mi dia errore.
un'ultima cosa, nel libro parla di membri 'mutable' e li usa per
ritornare la data sotto forma di stringa (funzione string_rep).
Dopo un certo ragionamento, mi è parso di capire che questa
sia l'implementazione migliore senza far uso di cast,
però servono anche altri membri che non sono inclusi nella
classe che ho scritto sopra:
class Date {
  mutable bool cache_valid;
  mutable string cache;
  void compute_cache_value() const; // riempie la cache
public:
  string string_rep() const; // rappresentazione sotto forma di stringa
};
quindi
string Date::string_rep() const
{
   if (!cache_valid) {
     compute_cache_value();
     cache_valid = true;
  }
  return cache;
}
che poi possono avere il seguente uso:
Date d3;
const Date d4;
string s3 = d3.string_rep();
string s4 = d4.string_rep();
ora però nella classe iniziale (quella che ho scritto all'inizio)
menziona soltanto string_rep() e non gli altri membri.
allora come intenderebbe usare string_rep()?
ci sono altri modi validi senza usare quei 'mutable'?
ciao e grazie in anticipo

 ovvero non so come restituire un enum senza che mi dia errore.
Ma a te il mese serve sotto forma di intero no?
Se si, allora devi mettere int come tipo di ritorno e restituisci lo stesso 
numero che passi come parametro.
Es.
int mese (int x) {
                return x;
        };
Anche se non so a che possa servire...
Ah, si scrive Stroustrup
Ciao
-- 
Luigi
--
bug windows [5] = {"95", "98", "NT", "Me", "2000"};


non è che mi serva a niente, è solo un esempio, però non
hai risposto alla mia domanda!
in questo caso posso certamente fare a meno di 'enum'
ma il problema rimane.
PS. e del fatto che non mi riconosca le 'string'???
#include <string.h>
string s;   <-- errore!
su msdn ho trovato questo (che poi è C)
#include <stdio.h>
char  c = 'c',  *string s = "ciao";
printf("%s",string);
e non dà nessun errore, ma se tolgo quel 'char' davanti, SI !
ma che roba è ????

ok, scusate!
su msdn era in effetti:
char* string = "ciao";
però il dubbio mi è rimasto, insomma il tipo
'string' esiste o me lo sto inventando io?

 perň il dubbio mi č rimasto, insomma il tipo


 'string' esiste o me lo sto inventando io?
Esiste nel namespace std come specializzazione del template std::basic_string.
Entrambe sono definiti in <string>
Le dichiarazioni sono quasi certamente qualche cosa del tipo:
namespace std {
// ...
template <
    class CharType,
    class Traits=char_traits<CharType>,
    class Allocator=allocator<CharType>
    >    class basic_string {
    // ...
};
// ...
    typedef basic_string<char> string;
// ...
} // end namespace std
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

 ma che roba è ????
char c = 'c';
char *string s = "ciao";
in questo caso string e' il nome di una variabile. Ma il codice e' decisamente
'C style'.


 ma il problema rimane.
Per ritornare un enum non so come si possa fare, cmq gli elementi di un 
enum sono interi, quindi oltre quello non credo possa ritornare altro.
