Newsgroup: it.comp.lang.c++
Titolo: Dov'é l'errore?

Salve a tutti,
da poco mi sono addentrato nella programmazione c++,
attraverso un corso prelevato in Internet (
www.swcp.com/~dodrill
).
Vorrei chiederVi dov'é l'errore nel seguente e semplice
frammento di codice:
(io utilizzo come compilatore il DjGpp per DOS e interfaccia Rhide)
#include <iostream.h>
class rectangle
{
     int height;
     int width;
public:
     int area(void);
     void initialize(int,int);
};
int rectangle::area(void)
{
return height * width;
}
void rectangle::initialize(int init_height,int init_width)
{
height=init_height;
width=init_width;
}
struct pole
{
int lenght;
int depth;
};
void main()
{
rectangle box,square;
pole flag_pole;
box.initialize(12, 10);
square.initialize(8, 8);
flag_pole.lenght=50;
flag_pole.depth=6;
cout<<"The area of the box is "<<box.area()<<endl;
cout<<"The area of the square " <<square.area()<<endl;
cout<<"The funny area is "<<area(square.height,box.width)<<endl; *
cout<<"The bad area is "<<area(square.height,flag_pole.depth)<<endl; *
}
Il risultato dell'esecuzione deve essere:
The area of the box is 120
The area of the square 64
The funny area is 80
The bad area is 48
però il compilatore mi dice....:
member 'height'(e lo stesso per ' width') is a private member of class
'rectangle'....
Io gli errori li ottengo dove ho messo gli asterischi.
So che per default in una classe l'inizializzazione delle variabili é
'private' però mi sembra che le varibili in questione le uso attraverso
la funzione membro 'initialize' é così?
Grazie per l'attenzione e scusate per il messaggio lungo.
Saluti,
Claudio


wrote:

Anche io non sono espertissimo di c++( ho cominciato la settimana
scorsa...:)), per cui i miei consigli vanno presi con le molle, però
analizzando il tuo codice ho notato un paio di cose:
1) la funzione membro la hai dichiararta void e nelle due righe
segnalate la chiami su due parametri
2) i parametri su cui chiami la funzione sono del tipo "square.height"
ora height è un membro privato dell'oggetto square per cui non vi puoi
accedere in quel modo: o lo dichiari public (considerato brutto stile
di programmazione) o costruisci una funzione get che lo restituisca
come quella che riporto sotto(analogamente per gli altri parametri):
int get() {return height;};
un consiglio che ho trovato su di un libro e che mi ha molto aiutato:
ai data member di una classe premetti qualcosa di fisso (io uso its,
ad esempio itsheight) in modo da capire che è un data member perchè
quando hai qualcosa di un po' piu' complicato non si capisce piu'
nulla.
Spero di essere stato utile
P.S. Grazie per l'esercizio di bug buster!

 frammento di codice:
Perchè tu hai richiamato due variabili membro private direttamente, senza
utilizzare nessuna interfaccia di classe. Prova a crearti due funzioni
membro (pubbliche ovviamente) tipo GetHeight { return Height; } che
ritornino il tipo di dati che ti serve.
--
         ______            __  _____
        /  ___/\           _/ / __  \
       /  /__ \/__   __  ._/ / /__/ /\
       \___  \ /  | /  |\   / _____/ /
 _________/  // /||//| ||__/ /\____\/
 |__________//_/ |_/ |______/ /
 \__________\\_\/\_\/\______\/
       ===>> 
S...@IPSNET.IT
 <<===
 => 
http://www.gamblecity.com/Sm3P
 <=
        ------------------------
        "Consiste ut procederas"

---------------------------------------------------------<


Ciao Claudio,penso che l'errore è voluto da chi ha scritto il
programma per mettere in evidenza che la funzione area può essere
richiamata solo da un oggetto di tipo rectangle, e non con due
qualsiasi interi area(int,int) (inoltre è dichiarata area (void), cioè
non prende parametri in input ma può essere invocata solo con
OggettoRectangle.area())