Newsgroup: it.comp.lang.c++
Titolo: Problemi con include

Salve a tutti,
il seguente pezzo di codice non compila:
// TEMPO.C
using namespace std;
class tempo {
public:
tempo (int o=0, int m=0, int s=0);
int ore() {return (sec/3600);};
int minuti() {return (sec/60)%60;};
int secondi() {return sec%60;};
private:
int sec;
};
tempo::tempo (int o, int m, int s)
{
	if (o>23 || o<0 || m>59 || m<0 || s>59 || s<0) sec=0;
	else sec=o*3600+m*60+s;
};
ostream& operator<<(ostream& os, tempo& t)
{
	return os << t.ore() << ':' << t.minuti() << ':' << t.secondi();
};
L'errore riportato č: tempo.C:21: error: expected constructor, 
destructor, or type conversion before '&' token
Ma se il costruttore gliel'ho piazzato bello grande subito sotto la 
definizione della classe tempo! Che gli prende? Ci sto perdendo il sonno...
-- 
U4U
Debian GNU/Linux x86_64 edition

 
A me compila perfettamente, nonostante un mucchio di punti e virgola
inutili (dopo la graffa di chiusura di una funzione). Mancano anche una
cifra di "const" (ai metodi ed ai parametri).
Basta ricordarsi l'include di iostream all'inizio del file.
PS: conviene chiamare i file di implementazione con l'estensione ".cc" o
".cpp" per evitare confusioni.
-- 
Matteo Settenvini
FSF Associated Member
Email : 
mat...@member.fsf.org
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d--(-) s+:- a-- C++ UL+++
P?>++ L+++>$ E+>+++ W+++ N++ o?
w--- O- M++ PS++ PE- Y+>++
PGP+++ t+ 5 X- R tv-- b+++ DI+
D++ G++ e h+ r-- y?
------END GEEK CODE BLOCK------

 ".cpp" per evitare confusioni.
Davvero? Questa è la nomenclatura "standard" (se ne esiste una)? Lo 
chiedo perchè mi pareva di aver capito che in windows si preferisce 
chiamare i file sorgente con estensione .cpp, mentre in linux .C ma a 
dire il vero non ne sono totalmente sicuro.
Grazie per l'ispirazione che mi ha portato a risolvere il problema!


 
Di nulla, so bene cosa voglia dire perdere ore per un punto e virgola
mancante alla chiusura di una unione o una classe... ;-) è proprio vero
che a volte sono i problemi più banali a portar via più tempo.


 Debian GNU/Linux x86_64 edition
scusa perchè non adottate questo nuovo modo di iniziare a scrivere in
C++
#include <iostream>
using namespace std;

 using namespace std;
Iniziare un programma in questo modo è una pessima abitudine, come è stato 
detto infinite volte.
L'adozione del namespace 'std' serve proprio ad evitare collisioni tra 
i nomi definiti nella libreria standard e quelli definiti dal programmatore 
o da eventuali librerie esterne che non si avvalgono dei namespace.
Se si iniettano indiscriminatamente tutti i nomi del namespace 'std' nel 
namespace corrente si annulla completamente l'utilità di avere un namespace 
separato.
Max

Siete stati così gentili, che mi permetto di disturbarvi ancora con un 
altro piccolo quesito :)
Ho un piccolo programma di test (per questo perdonate i vari using 
namespace std qui e lì) così composto:
//TEMPO.H
#ifndef TEMPO_H
#define TEMPO_H
using namespace std;
class tempo { //definizione della classe tempo };
#endif
//TEMPO.C
#include "tempo.H"
#include <iostream>
using namespace std;
tempo::tempo (int o, int m, int s) { //definizione del costruttore di tempo}
ostream& operator<<(ostream& os, tempo& t)
{
	return os << t.ore() << ':' << t.minuti() << ':' << t.secondi();
}  //ridefinizione dell'operatore di stampa per la classe tempo
//MAIN.C
#include "tempo.H"
#include <iostream>
using namespace std;
extern ostream& operator<<(ostream& , tempo& );
main ()
{
	tempo t = tempo(15,10,24);
	cout << "t segna le ore " << t << endl;
	cout << "t ha per secondi " << t << endl;
	return 0;
}
E' corretto, nel senso che compila, ma quell'extern dichiarato in main.C 
mi dà da pensare, visto che a lezione il prof non lo usa. E' possibile 
compilare questo programma senza usare l'extern e mantenendolo in tre 
file distinti? Levando l'extern e compilando i due file tempo.C e main.C 
assieme mi dà un enorme errore, come se nel main.C non riuscisse a 
trovare la ridefinizione dell'operatore di stampa << per la classe 
tempo. Ma è scritta nel file che sto compilando assieme al main.C !
Grazie e scusate le mie domande alquanto primitive :)


 #endif
----------
La definizione, invece, va bene in tempo.C.
Quindi, togli l'extern.
Ciao,


 
PS: dimenticavo; ovviamente manca l'include di iostream, che va appena
dopo la macro che definisce TEMPO_H.
Ciao di nuovo,


 [CUT]
Matteo, se un giorno sarò papa, stai sicuro che tu diventerai santo :)
Grazie!


 Grazie!
Ah, ti auguro anche tanta fortuna per l'organizzazione delle lezioni 
dalla metà della settimana prossima (cfr email di qualche minuto fa) :D 
ma quant'è piccolo il mondo :)
-- 
U4U - under Windows now