Newsgroup: it.comp.lang.c++
Titolo: class date che da mille problemi

ma cos'ha questa classe che mi da mille problemi?
ogni volta che introduco qualche modifica qualche funzione qua dentro da
problemi, veramente inizio a non poterne più..
questa versione in particolare mi da mille problemi,
per es:
50 C:\Documents and Settings\...\date.h type specifier omitted for parameter
`string'
50 C:\Documents and Settings\...\date.h parse error before `,' token
51 C:\Documents and Settings\...\date.h missing ';' before right brace
52 C:\Documents and Settings\...\date.h ISO C++ forbids declaration of `mn'
with no type
53 C:\Documents and Settings\...\date.h parse error before `for'
che gli posso fare?
come posso aggiustare il tutto togliendo la deprecated stream.h?
grazie
Giulio
-----------------------------------
//date.h
#ifndef DATE_H
#define DATE_H
#include <stream.h>
#include <math.h>
#include <stdlib.h>
#include <string>
class date{
  private:
    int mese, giorno, anno;
    int maxi(int a, int b){ if (a>b) return(a); else return (b); };
    int mini(int a, int b){ if (a<b) return(a); else return (b); };
  public:
    //I/O
    friend ostream& operator<<(ostream& os, date& d) {
        return os << d.giorno<<" " << d.mese<<" " << d.anno<<" ";
    };//end <<
    friend istream& operator>>(istream& os, date& d){
        os >> d.giorno >> d.mese >> d.anno;
        return os;
    };//end >>
    int getGiorno(){return giorno;};
    int getMese()  {return mese;  };
    int getAnno()  {return anno;  };
    void setGiorno(int a){giorno=a;};
    void setMese(int a)  {mese  =a;};
    void setAnno(int a)  {anno  =a;};
    date (int dy, int mn, int yr){
       static int length[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,
30, 31 };
       giorno=maxi(1,dy);
       giorno=mini(giorno, length[mn]);
       mese = maxi(1, mn);
       mese = mini(mese, 12);
       anno = maxi(1, yr);
    };//end date
    date() { date(1,1,1); };
    date (int dy, string mn, int yr){
        static string mesi[] =
{"gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","
settembre","ottobre","novembre","dicembre"};
        mn = tolower(mn);
        for (int i = 0; i <= 12; i++)
           if ( mn == mesi[i]) break;
        date(dy, i, yr);
    };// end date
};//end class
#endif
-----------------------------------
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.426 / Virus Database: 239 - Release Date: 02/12/2002

 come posso aggiustare il tutto togliendo la deprecated stream.h?
io credo che semplicemente dovresti usare <iostream> invece
di <stream.h> e mettere gli identificatori di namespace davanti alla
parola string
Inoltre c'č un problema con la funzione tolower
(e un po' di ';' di troppo :-) )
In pratica la farei cosě:
//date.h
#ifndef DATE_H
#define DATE_H
#include <iostream>
// #include <math.h> // sarebbe meglio <cmath>, ma fa nulla...
// #include <stdlib.h> // non serve
#include <string>
#include <algorithm>
#include <cctype>
struct lower
{
  unsigned char operator() (unsigned char c)
  {
     return std::tolower(c);
  }
};
class date
{
  private:
    int mese, giorno, anno; // unsigned int?
    int maxi(int a, int b){ if (a>b) return(a); else return (b); }
    int mini(int a, int b){ if (a<b) return(a); else return (b); }
  public:
    //I/O
    /*
    friend ostream& operator<<(ostream& os, date& d) {
        return os << d.giorno<<" " << d.mese<<" " << d.anno<<" ";
    };//end <<
    */
    // Perché friend???
    std::ostream& operator<<(std::ostream& os)
    {
        return os << giorno<<" " << mese<<" " << anno<<" ";
    }
    /*
    friend istream& operator>>(istream& os, date& d){
        os >> d.giorno >> d.mese >> d.anno;
        return os;
    };//end >>
    */
    std::istream& operator>>(std::istream& os)
    {
        os >> giorno >> mese >> anno;
        return os;
    }
    int getGiorno(){return giorno;}
    int getMese()  {return mese;}
    int getAnno()  {return anno;}
    void setGiorno(int a){giorno=a;}
    void setMese(int a)  {mese=a;}
    void setAnno(int a)  {anno=a;}
    date (int dy, int mn, int yr)
    {
       /*
       static int length[] =
       { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,30, 31 };
       */
       //perché static?
       //perchč metti 13 mesi col primo di lunghezza 0?
       unsigned int length[] =
       {31, 28, 31, 30, 31, 30, 31, 31, 30, 31,30, 31 };
       giorno=maxi(1,dy);
       giorno=mini(giorno, length[mn]);
       mese = maxi(1, mn);
       mese = mini(mese, 12);
       anno = maxi(1, yr);
    }//end date
    date() { date(1,1,1); }
    /*
    date (int dy, string mn, int yr){
        static string mesi[] =
{"gennaio","febbraio","marzo","aprile","maggio","giugno","luglio",
"agosto","settembre","ottobre","novembre","dicembre"};
        mn = tolower(mn);
        for (int i = 0; i <= 12; i++)
           if ( mn == mesi[i]) break;
        date(dy, i, yr);
    };// end date
    */
    date(int dy, std::string mn, int yr)
    {
        std::string mesi[] =
        {"gennaio","febbraio","marzo","aprile","maggio","giugno",
        "luglio","agosto","settembre","ottobre","novembre",
        "dicembre"};
        /*
        mn = tolower(mn);
        */
        // errore! il prototipo di tolower č int tolower(int)
        // non puoi passargli una std::string)
        // devi aggiungere la struct lower come ho messo in cima
        // e poi fare:
        std::transform( mn.begin(), mn.end(), mn.begin(), lower() );
        /*
        for (int i = 0; i <= 12; i++)
        */
        // i mesi sono 12 :-)
        unsigned int i;
        for (i= 0; i < 12; ++i)


        date(dy, i, yr);
quando chiami date(dy, i, yr) la variabile i non e' definita (out of
scope).
Il secondo e' nella definizione dell'array contenente i nomi dei mesi;
se non inserisci come primo elemento una stringa vuota (come hai
inserito uno 0 nell'array della lunghezza dei mesi) il giorno "1
gennaio" verra' tradotto come "1 0" e non come "1 1".
Per ultimo, tolower non puo' essere utilizzato con le stringhe: e'
definito come:
#include <ctype.h>
int tolower(int ch);
Ci deve essere un thread recente sull'argomento.
Non "riposto" la parte finale del tuo messaggio (con il sorgente
"completo" del file "date.h")
Ciao.
Fulvio

 #include <ctype.h>
meglio aggiornarsi e digitare:
#include <cctype>
comunque sono sottiglieze.


wrote:

Grazie (le sottigliezze sono importanti). 
Avevo "copiato e incollato" la definizione da un altro documento e non
ci avevo fatto caso. 
Fulvio