Newsgroup: it.comp.lang.c++
Titolo: classe - compilatore bastardo?

sto _provando_ a fare una classe semplice semplice in C++
quando vado a compilare il programma che ho scritto (allegato sotto) il
compilatore (MS Visual C++ 6.0) mi dà questo errore:
--------------------Configuration: ClassTest - Win32
Debug--------------------
Compiling...
main.cpp
D:\classtest\main.cpp(24) : error C2533: 'Cane::Cane' : constructors not
allowed a return type
Error executing cl.exe.
ClassTest.exe - 1 error(s), 0 warning(s)
che cosa significa???
--
ciao
..::[xaero]::..
ecco il programma:
/*---- main.cpp ----*/
#include <iostream>
#include <cstdlib>
#include <string>
using std::string;
using std::cout;
using std::cin;
using std::endl;
class Cane {
private:
 int age;
 string name;
public:
 Cane(string _name);
 Cane(string _name, int _age);
 ~Cane();
 int GetAge();
 void SetAge(int _age);
 void Abbaia();
}
Cane::Cane(string _name) {
 name = _name;
 age = 0;
}
Cane::Cane(string _name, int _age) {
 age = _age;
 name = _name;
}
Cane::~Cane() {
 cout << "Il cane " << name << " e' morto a "
  << age << " anni" << endl;
}
void Cane::Abbaia() {
 cout << "Bau! Bau! Bau!   ;-)" << endl;
}
int Cane::GetAge() {
 return age;
}
void Cane::SetAge(int _age) {
 age = _age;
}
int main(void)
{
 return 0;
}
/*---- end of main.cpp ----*/

Ho guardato solo il costruttore, e va bene. Devi sapere che la segnalazione
degli errori di VC++ è pessima: credo che l'errore sia generato dal fatto
che non hai messo il punto e virgola alla fine della dichiarazione della
classe Cane, dopo l'ultima parentesi graffa prima della definizione del
costruttore. Prova, e credo che l'errore sparirà. Non si tratta di
"compilatore bastardo", ma di "compilatore incompetente sugli errori".
Domenico Barra

 ha scritto nel messaggio
news:oGO06.162069$hk4.5...@news.infostrada.it...

...vabbé che ho notato che errorini come una graffa o un ; in meno possono
scatenare la furia di molti compilatori in modi a dir poco originali... ma
com'è che vanno tutti nel pallone per una graffa, ma poi magari ti trovano
problemi di ereditarietà multipla arzigogolata con scappellamento a destra
come se niente fosse ?
Massimo

 Ho guardato solo il costruttore, e va bene. Devi sapere che la

ti ringrazio avevi ragione
vorrei sapere una cosa
nel programma che ho fatto (allegato in basso) ho fatto un paio di cose con
quella classe, e nel distruttore ho messo un cout << "Il cane xxx e' morto a
xxx anni"
vorrei sapere quando vengono distrutte le classi
da quello che ho visto vengono distrutte alla fine del programma
ma magari mi sbaglio, oppure c'è un modo per distruggerle quando voglio...
(?)
ecco il programma (p.s. mi dite se c'è qualcosa di scorretto, errato lo
stile, ecc...?)
#include <iostream>
#include <cstdlib>
#include <string>
using std::string;
using std::cout;
using std::cin;
using std::endl;
class Cane {
private:
 int age;
 string name;
public:
 Cane();
 Cane(string _name);
 Cane(string _name, int _age);
 ~Cane();
 int GetAge();
 void SetAge(int _age);
 string GetName();
 void SetName(string _name);
 void Abbaia();
};
Cane::Cane() {
 name = "unnamed";
 age = 0;
}
Cane::Cane(string _name) {
 name = _name;
 age = 0;
}
Cane::Cane(string _name, int _age) {
 age = _age;
 name = _name;
}
Cane::~Cane() {
 cout << "Il cane " << name << " e' morto a "
  << age << " anni." << endl;
}
string Cane::GetName() {
 return name;
}
void Cane::SetName(string _name) {
 name = _name;
}
void Cane::Abbaia() {
 cout << "[" << name << "]  " <<
  "Bau! Bau! Bau!   ;-)" << endl;
}
int Cane::GetAge() {
 return age;
}
void Cane::SetAge(int _age) {
 age = _age;
}
int main(void)
{
 Cane cCaneBobby("bobby", 5), cCaneFido("pig", 8);
 cCaneBobby.Abbaia();
 cout << "Il cane " << cCaneBobby.GetName() << " ha " <<
  cCaneBobby.GetAge() << " anni." << endl << endl;
 cCaneFido.SetName("fido");
 cCaneFido.Abbaia();
 cout << "Ancora in esecuzione..." << endl << endl;
 return 0;
}


wrote:

Veramente l'errore e' abbastanza chiaro... se scrivi:
  class X
  {
    ...
  }
  myfunc(int x)
  {
    ...
  }
Il compilatore si aspetta che "myfunc" sia una funzione che
ritorna un oggetto di tipo X. La mancanza del ";" ha detto al
compilatore che Cane::Cane(...) tornasse un oggetto di tipo Cane.
Giustamente il compilatore si e' lamentato che un costruttore
(come Cane::Cane) non puo' avere nessun return type.
HTH
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

 stile, ecc...?)
Non riporto il listato perché è un po' lungo. Non si può parlare di errori
di stile su un programma così piccolo, ma quello che ho notato è che fai uso
di variabili che iniziano per underscore ("_"). Questa è una pratica in
generale errata perché i nomi inizianti per underscore sono per convenzione
riservati al compilatore.
Ciao
Domenico Barra

(come Cane::Cane) non puo' avere nessun return type.
La mancanza del ";" fa sembrare al compilatore che il codice fosse di questo
tipo:
Cane Cane::Cane(...)
dando errore?
Grazie
-- 
Posted from 
mail-2.tiscalinet.it
 [195.130.225.148] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

dando errore?
Esatto. Quando scrivi
   class MyClass { public: int x; } myc;
hai fatto due cose: definito una classe e una istanza chiamata
"myc" di quella classe. Se dimentichi un punto e virgola dopo una
definizione di classe e segue un costruttore il compilatore
pensa che tu abbia voluto dichiarare un costruttore che ritorna
una istanza della classe (cosa vietata: i costruttori non hanno
un valore di ritorno).


 un valore di ritorno).
Grazie e... BUON NATALE!

(come Cane::Cane) non puo' avere nessun return type.
Ormai sembra diventata una moda del ng prendersela contro i messaggi
di errore del VC++, ma effettivamente stavolta lo sbaglio c'era ed era
fin troppo evidente.
Per curiosità ho compilato il programma con il BCB3 e mi ha restituito
i seguenti errori sulla riga del costruttore della classe 'Cane'.
1) type 'Cane' may not be defined here.
2) Constructor cannot have a return type specification.
Quindi vi prego ragazzi, non addossate al compilatore le colpe per gli
errori da voi commessi, anche perché la cosa é totalmente
controproducente.
Il Ghenio
WINWORD.EXE - ERRORE DI APPLICAZIONE
l'istruzione a "0x3017ff27"ha fatto riferimento alla
memoria a "0x02a3143c".La memoria non poteva essere 'read'.

 (come Cane::Cane) non puo' avere nessun return type.
Non vorrei fare una figuraccia... ma il C++ ammette dichiarazioni di classi
all'interno di dichiarazioni di funzioni? Avevo letto da qualche parte che
non era possibile. O era solo all'interno della lista parametri? Grazie a
chiunque mi risponda, perché non riesco a rintracciare il punto esatto sullo
Stroustrup.
Domenico Barra

Perche' la costruzione
class A {} b() {}
e' sintatticamente valida e questo rende sostanzialmente impossibile
individuare correttamente l'errore. Come ama dire Stroustrup: il
compilatore non e' telepatico.
Ciao,
Nicola

il compilatore non e' telepatico.
ROTFL ;)
--
Andrea Laforgia (ICQ 87230455)
http://www.geocities.com/AndreaLaforgia
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."

 ROTFL ;)
Devo ammettere che non e' che la diretta traduzione di una frase che
apparentemente piace molto a B. Stroustrup: "The compiler isn't
psychic".
Ciao,
Nicola