PDA

Visualizza la versione completa : [C++] Utilizzo delle classi


P4nico
26-11-2007, 20:04
Vi chiedo giusto qualche delucidazione sulle classi.
Una volta scritta una classe in un file, come faccio ad utilizzare quella classe da un altro file .cpp? La classe deve essere salvata .h ed inclusa nelle librerie oppure si puo includere anche un .cpp?

Inoltre mi viene spontanea una curiosità... da quel che ho capito le classi sono un'innovazione introdotta dal c++, e per quanto riguarda il c, il corrispondente delle classi sono le cosy dette typedef struct?

oregon
26-11-2007, 20:20
Originariamente inviato da P4nico
Vi chiedo giusto qualche delucidazione sulle classi.
Una volta scritta una classe in un file, come faccio ad utilizzare quella classe da un altro file .cpp?

Dichiari una istanza della classe usando il nome della stessa.



La classe deve essere salvata .h ed inclusa nelle librerie oppure si puo includere anche un .cpp?

Non ho capito ...



Inoltre mi viene spontanea una curiosità... da quel che ho capito le classi sono un'innovazione introdotta dal c++, e per quanto riguarda il c, il corrispondente delle classi sono le cosy dette typedef struct?

No ... sono cose distinte ... il C non dispone del concetto di classe.

P4nico
26-11-2007, 20:35
Cosa vuol dire dichiarare un'istanza della classe? Quest'istanza può essere chiamata da un'altro programma?

Intendevo se era possibile scrivere una classe e salvarla in un file .h in modo che poi in un'altro programma per utilizzare la stessa classe bastava fare #include <mia_classe.h>.

Inoltre sto scrivendo questo codice:



/*
Gestione delle classi con allacazione dinamica di memoria
*/

#include <stdio.h>

struct OnePixel {
unsigned char r,g,b;
OnePixel()
{
b=g=r='\0';
}
};

class Pixmap
{
private:
int w;
int h;
OnePixel *pixels;
public:
Pixmap()
{
h=w=0;
pixels = NULL;
}

void resize(int ww, int hh){
kill();
if(ww>0 && hh >0)
{
pixels = new OnePixel[ww*hh];
if (pixels) { w= ww; h= hh;}
}
}

void kill(){
h=w=0;
delete[] pixels;
pixels = NULL;
}

~Pixmap()
{
delete[] pixels;
}

OnePixel get_pixel(int i, int j)
const {
return pixels[i*w+j];
}

void set_pixel(OnePixel new_pixel, int i, int j){
pixels[i*w +j] = new_pixel;
}

// Grosso dubbio sulle get_
OnePixel get_width()
const { return pixels[w];}

OnePixel get_height()
const { return pixels[h];}

};

Il problema è che non sò come strutturare una funzione get_ , mi serve avere la possibilità di sapere il valore delle variabili w e h dalla funzione main, come posso intestare le varie get_ per farmi dire il valore delle due variabile Private?

P4nico
28-11-2007, 01:06
Ho risolto almeno gli errori di compilazione con il seguente codice, ora volevo chiedervi se questo codice è effettivamente funzionante.

Mi riferisco specialmente alle funzioni get_width() e get_height(), inoltre volevo chiedervi se effettivamente si chiamano funzioni?


/*
Gestione delle classi con allacazione dinamica di memoria
*/

#include <stdio.h>

struct OnePixel {
unsigned char r,g,b;
OnePixel()
{
b=g=r='\0';
}
};

class Pixmap
{
private:
int w;
int h;
OnePixel *pixels;
public:
Pixmap()
{
h=w=0;
pixels = NULL;
}

void resize(int ww, int hh){
kill();
if(ww>0 && hh >0)
{
pixels = new OnePixel[ww*hh];
if (pixels) { w= ww; h= hh;}
}
}

void kill(){
h=w=0;
delete[] pixels;
pixels = NULL;
}

~Pixmap()
{
delete[] pixels;
}

OnePixel get_pixel(int i, int j)
const {
return pixels[i*w+j];
}

void set_pixel(OnePixel new_pixel, int i, int j){
pixels[i*w +j] = new_pixel;
}

// Compito

int get_width() const { return w;}
int get_height() const { return h;}
Pixmap_resize (int ww, int hh) {
pixels = new OnePixel[ww*hh];

if (pixels!=NULL){
w=ww; h =hh;
}
}

};

void main()
{

int n = 10;
Pixmap m;
m.resize(256,400);
Pixmap *pm = new Pixmap;
pm->resize(256,400);
delete pm;
Pixmap *am = new Pixmap[n];
for (int i=0;i<n; i++)
delete[] am;

// Esercizio per casa

printf("La larghezza e': %d\n", m.get_width());
printf("L'altezza e': %d\n",m.get_height());
m.Pixmap_resize(10,20);

}

shodan
28-11-2007, 02:01
Originariamente inviato da P4nico
Ho risolto almeno gli errori di compilazione con il seguente codice, ora volevo chiedervi se questo codice è effettivamente funzionante.


Ci sono delle imprecisioni che spiego in seguito.



Mi riferisco specialmente alle funzioni get_width() e get_height(), inoltre volevo chiedervi se effettivamente si chiamano funzioni?


Si. In C++ stretto si chiamano funzioni membro (termine ormai in disuso). Ora va di moda chiamarle metodi. In particolare le funzioni con prefisso get sono dette accessor, quelle con il set, mutators. Ma sempre funzioni sono.




/*
Gestione delle classi con allacazione dinamica di memoria
*/

// in C++ l'header corretto è <cstdio> con il prefisso std:: davanti alle funzioni che espone
#include <cstdio>

// l'azzeramento si può mettere meglio in questa forma
Pixmap() : h(0), w(0), pixels(NULL)
{
// h=w=0;
// pixels = NULL;
}
...
void resize(int ww, int hh){
kill();
if(ww>0 && hh >0)
{
pixels = new OnePixel[ww*hh];
if (pixels) { w= ww; h= hh;}
}
}


In C++ standard, new se fallisce non ritorna un puntatore NULL, ma solleva un'eccezione di tipo std::bad_alloc.




// ottimo
int get_width() const { return w;}
int get_height() const { return h;}


Pixmap_resize (int ww, int hh) {
pixels = new OnePixel[ww*hh];

if (pixels!=NULL){ // // vedi commento sul new sopra
w=ww; h =hh;
}
}

};



No void main(). ma int main() è richiesto dallo standard. E non chiedere perché, è così e basta :D




//void main()
int main()
{

int n = 10;
Pixmap m;
m.resize(256,400);
Pixmap *pm = new Pixmap;
pm->resize(256,400);
delete pm;

Pixmap *am = new Pixmap[n];

/* BOOOM
E' sufficiente delete[] am; per deallocare un array.
*/
// for (int i=0;i<n; i++)
delete[] am;

// Esercizio per casa

std::printf("La larghezza e': %d\n", m.get_width());
std::printf("L'altezza e': %d\n",m.get_height());
m.Pixmap_resize(10,20);

}

Se std:: tedia (e dopo un pò lo fa) basta mettere using namespace std; appena prima del main.

Loading