Newsgroup: it.comp.lang.c++
Titolo: Dichiarazioni in PRIVATE

Salve,
ho risolto per caso alcuni errori che mi assillavano da tempo. In pratica 
l'applicazione crashava continuamente. Avevo la dichiarazione di una classe 
nella sezione private del .H anzichè in testa cal file .CPP
Ebbene spostando la dichiarazione dall'area "private" del .h in testa al 
file .cpp tutto funziona...come mai?
Grazie per le risposte ad una domanda niubba

 Grazie per le risposte ad una domanda niubba
-- 
Salvatore

> Non sono sicuro di aver capito ... mi puoi fare un esempio?
Aloura...nel file main.cpp ho una struttura Pippo:
// main.cpp
typedef struct Pippo
{
    unsigned short int valore;
};
poi una classe Tizio che dichiara una variabile di tipo Pippo nella sezione 
private:
// tizio.h
classe Tizio {
    public:
    private:
        Pippo pippo;
};
// tizio.cpp
int main(void)
{
    pippo.valore = 1;
}
Ebbene in questo modo il programma va in errore.
Se la dichiarazione Pippo pippo la metto in vece nel file tizio.cpp e non (o 
anche) nel file tizio.h funziona tutto, in questo modo:
// tizio.h
classe Tizio {
    public:
    private:
};
// tizio.cpp
Pippo pippo;
int main(void)
{
    pippo.valore = 1;
}
.......Perchč? 

 }
 >
 > .......Perchè?
A occhio mi sembra che tu stia facendo due cose completamente diverse, 
ma non ho ben capito quali.
Riporta i due esempi completi e vedremo.
  bye
	av.

 }
...e quindi sei libero di assegnare un valore al membro dato 'valore'
dell'istanza 'pippo' della struct 'Pippo'.
La sensazione e' che tu abbia bisogno di un buon libro da studiare. A
tentoni col C++ non si va da nessuna parte.
Ciao,
Nicola

 .......Perchè?
Dal 'programma utente' della classe non puoi accedere ai membri privati
della classe. Questo è un errore grave ma facilmente correggibile :)
In ogni caso, l'istruzione pippo.valore = 1 ti fa accedere alla 
variabile pippo che è di tipo Pippo e che hai dichiarato la seconda
volta: nota bene che questa variabile non è il membro della
classe che (credo) volevi usare tu. È semplicemente una variabile
di tipo Pippo. 
Per accedere al campo "valore" della struttura "pippo" che a sua volta
è membro di una classe, devi 'salire di un livello' e usare l'operatore
"." ancora una volta:
Tizio tizio;
tizio.pippo.valore=1;
Il seguente codice lo puoi compilare, non dà errori: 
ovviamente ho dovuto dichiarare pippo come membro PUBBLICO
della classe Tizio, altrimenti non posso accedervi dal 'programma utente'
della classe.
//file tizio.h
struct Pippo{
unsigned int valore;
};
class Tizio {
        public:
        Pippo pippo;
};
//file tizio.cpp
#include "tizio.h"
int main()
{
Tizio passante;
/* adesso esiste un oggetto di tipo Tizio, 'passante', avente un membro
pubblico che si chiama pippo; */
passante.pippo.valore = 1;
return 0;
}
-- 
Salvatore

 }
Grazie 1000 Salvatore, poche parole e senza tanti fronzoli sei arrivato al 
nocciolo.
Grazie ancora 

 senso.
Io direi pure che è ill-formed. Ho solo spulciato di sfuggita lo
standard, tuttavia.
-- 
blog:  
http://www.akropolix.net/rik0/blogs
 | Uccidete i filosofi,
site:  
http://www.akropolix.net/rik0/
      | tenetevi riso e
forum: 
http://www.akropolix.net/forum/
     | bacchette per voi.

 senso.
Se non metto typedef prima di struct ottengo 102 tizio.h `Pippo' does not 
name a type
saluti 

gio@work ha scritto:

Eh? E' molto strano.
Che compilatore usi?
Puoi riportare il file completo? Meglio ancora se ridotto all'osso per 
vedere questo errore.
Non e' che "Pippo" compare da qualche altra parte prima di questo punto?
  bye
	av.

 Non e' che "Pippo" compare da qualche altra parte prima di questo punto?
no, infatti tutte le dichiarazioni sono in un file defs.h che è in testa a 
tutti gli include, in pratica Pippo si compone di alcune strutture del tipo:
typedef struct A {
...
} A;
typedef struct B {
...
} B;
typedef struct C {
...
} C;
typedef struct Pippo {
A a;
B b;
C c;
} Pippo;
Poi dichiaro : Pippo pippo in un file tizio.cpp e va tutto bene. Se invece 
tolgo il typedef da uno qualsiasi di queste strutture ottengo una serie di 
errori del tipo:
102 'A' does not name a type
102 'B' does not name a type
102 'C' does not name a type
102 `Pippo' does not name a type
saluti 

 } Pippo;
Nota che qui Pippo compare due volte.
Se da questa togli "typedef", credo sia normale l'errore, ma nella 
precedente no.
  bye
	av.