Newsgroup: it.comp.lang.c++
Titolo: problema !!!

il seguente codice:
#include <stdio.h>
class pazienti
{
private:
 struct paziente
 {
  char nome [30];
  char cognome [30];
  int pagamento, fare, fatto;
 };
 paziente coda [30];
 int t, c;
public:
 paziente nuovo;
 int inserimento ();
 int estrazione ();
}
coda_pazienti (); // ricordarsi sempre di mettere il constructor, il 
costruttore, poiche' permette di preparare l'oggetto classe al suo utilizzo 
//
// dichiarazione prototipi //
void arrivo (void);
void main ()
{
 int scelta;
 do{
  printf ("\n        *** Programma Laboratorio Ecografie / Radiografie 
***\n\n\t1) Arrivo di un nuovo paziente\n\t2) Uscita da radiografia\n\t3) 
Uscita da ecografia\n\t4) Uscita da pagamento\n\t5) Uscita dal programma");
  printf ("\n\n\tSeleziona comando di menu'\t");
  scanf ("%d",&scelta);
  switch (scelta)
  {
  case 1:  // arrivo di un paziente //
   arrivo ();
   break;
  case 2:
   break;
  case 3:
   break;
  case 4:
   break;
  case 5:
   printf ("\n\tIl programma e' terminato !!!\n\tGrazie per averlo usato 
!!!\n\n\t");
   break;
  case 6: // inserimento prezzi //
   break;
  default:
   printf ("\n\tHai sbagliato, per favore reinserisci\n");
   break;
  }
 }
 while (scelta!=5);
}
void arrivo (void)
{
 printf ("Inserisci nome");
 scanf ("%s",nuovo.nome);
 printf ("Inserisci cognome");
 scanf ("%s",nuovo.cognome);
}
mi da questo errore che non so spiegarmi...
Compiling...
lab.cpp
C:\Programmi\Microsoft Visual 
Studio\MyProjects\laboratorio_medico\lab.cpp(60) : error C2065: 'nuovo' : 
undeclared identifier
C:\Programmi\Microsoft Visual 
Studio\MyProjects\laboratorio_medico\lab.cpp(60) : error C2228: left of 
'.nome' must have class/struct/union type
C:\Programmi\Microsoft Visual 
Studio\MyProjects\laboratorio_medico\lab.cpp(63) : error C2228: left of 
'.cognome' must have class/struct/union type
come se la struct nuovo non esistesse, invece c'e' e' nella classe e' ed 
public... come mai mi da' errore ?

 }
Il problema potrebbe essere che manca il punto e virgola qui?
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg
The EMG Music page:         
http://www.emagsoftware.it/emgmusic

class pazienti
{
private:
 struct paziente
 {
  char nome [30];
  char cognome [30];
  int pagamento, fare, fatto;
 };
 paziente coda [30];
 int t, c;
public:
 paziente nuovo;
 int inserimento ();
 int estrazione ();
};
anche mettendo il ; non cambia niente stesso errore... come se nuovo non ci 
fosse... 

 scanf ("%s",pippo.nuovo.nome);
ti continuerà a dare perennemente errore.
Al limite puoi mettere la dichiarazione della struct fuori dalla classe, 
dichiarare una variabile globale di tipo nuovo e poi eseguire il codice che 
hai scritto.
Spero di essere stato esaustivo
Giuseppe 

 public... come mai mi da' errore ?
Prova a pensare....
la classe pazienti contiene una variabile membro che si chiama nuovo ed ed 
e' di tipo struct paziente (nomi poco azzeccati).
Ora visto che arrivo non e' una funzione membro di pazienti, non sa cosa sia 
pazienti::nuovo. Ok, nuovo e' public, ma ... su quale oggetto chiami nuovo?
se tu cancelli tutto quello che la funzione nuovo contiene e ci metti:
pazienti p;
p.nuovo.nome;
dovrebbe funzionare, ora prova solo con:
nuovo.nome;
e ti dovrebbe dare errore.
Il motivo e' che nuovo esiste nel "namespace" pazienti: pazienti::nuovo ed 
essendo nuovo NON static devi chiamarlo su di un oggetto istanziato. Ad 
esempio su p dove p e' una istanza di pazienti.
Un'altra cosa, il codice che hai postato e' C++ nel senso che usi classi 
etc.. ma... e' lungi da essere codice C++ in stile C++. Ti consiglio di 
incominciare ad usare std::string, std::vector, etc...
Spero di esserti stato di aiuto, il mio consiglio e di tornare qualche 
capitolo indietro sul libro che stai studiando e ri-studiare quello che hai 
capito poco.
Tommaso

 sia pazienti::nuovo.
non sa cosa sia nuovo, usando lo scope resolution operator ovviamente lo 
sa...
Tommy

per me e' arcaico...
puoi essere piu' chiaro ?
grazie mille... 

 grazie mille...
ok, immagina il seguente codice:
class C{
public:
     int a;
};
void Funzione()
{
     a = 5;
}
il codice non puo' funzionare in quanto Funzione() non sa cosa sia a (a e' 
una variabile che fa parte della classe C, in C++ puoi dire C::a, ovvero la 
a del namespace C). Funzione() sa che esiste una classe che si chiama C e 
che questa ha una variabile membro che si chiama a, ma non sa cosa sia a da 
sola!
Le soluzioni sono diverse:
void Funzione()
{
     C c;
     c.a = 5;
}
il codice sopra funziona (e' tuttavia completamente inutile in quanto c e' 
una variabile locale che viene persa dopo che esci dalla funzione). Ad ogni 
modo, Funzione() sa che esiste una Classe di tipo C e decide di istanziare 
un oggetto c di tipo C. Dopo di che puoi usare la variabile c.a .
Un'altra soluzione e' ovviemente quella di avere una istanza della classe 
(un oggetto di tipo C) globale o.... passato come parametro di funzione e 
poi fare sempre c.a e non solo a.
Se vuoi usare a da sola devi dichiarare Funzione come una funzione membro di 
C:
class C{
public:
     int a;
     void Funzione(); /*** dichiarata qua ***/
};
void C::Funzione()  /***  nota il C::   ***/
{
     a = 5;
}
questo risolve il TUO problema parzialmente in quanto in main non poi puoi 
piu' fare:
int main()
{
     Funzione();
}
ora infatti Funzione fa parte anch'essa della classe C e quindi va chiamata 
su di un oggetto di tipo C:
int main()
{
      C c;
      c.Funzione();
}
In conclusione quando una funzione o una variabile sono membri di una classe 
devi chiamarli su di un oggetto della classe nella forma:
oggetto.variabile o oggetto.funzione().
Per complicare le cose, se definisci una funzione membro (metodo) o una 
variabile membro come static allora puoi chiamarli nel seguente modo:
nome_classe::variabile o nome_classe::funzione()
In pratica non devi per forza chiamarli su di una istanza delle classe 
(oggetto).
Ma... visto che sei parecchio indietro per ora dimenticherei questa cosa dei 
membri static e mi concentrerei su le cose basi.
Spero ora non sia arcaico, anche se il mattino presto (e questa settimana in 
generale sempre) non sono bravo a scrivere ;-)
Ah, su che libro stai studiando? A volte un libro migliore evita tutte 
queste confusioni strane...
Tommaso

 queste confusioni strane...
me l'ha spiegata il mio prof. di info, ed e' la prima volta che tenta di 
spiegare la programmazione orientata ad oggetti, e' gia' difficile per lui 
figurati per noi... in compenso e' piu' comoda e veloce del semplice "C"... 
ho anche comprato un libro che si chiama "La programmazione ad oggetti c++ e 
java" della atlas, ma non c'ho ancora dato un'occhiata !!!
Grazie mille per l'aiuto... come al solito sei sempre il migliore !!!