PDA

Visualizza la versione completa : [C++] Dubbio su classi = strutture?


zaxis
19-12-2005, 10:20
Ciao.
Sto studiando come e' stato scritto il codice del progetto
BSGUI (http://developer.berlios.de/projects/bsgui/) (una GUI semplice semplice basata su openGL).

Ci sono alcune cose che non capisco.
Ad esempio nel codice sotto (un file .h) non capisco l'uso della
struttura. Sembra essere tale e quale ad una classe...addirittura mi pare di capire che la struttura abbia persino un costruttore (Checkbox(Control *parent, int x1, int y1, int x2, int y2,char *caption);) ed un distruttore (virtual ~Checkbox();)

Nelle documentazioni che ho trovato non accennano a quest'uso delle strutture (o forse lo fanno piu' avanti, nelle sezioni avanzate a cui non sono ancora arrivato). Vorrei sapere come giudicate questo utilizzo e che differenza c'e'tra questa struttura ed una classe vera e propria...


Poi ho due dubbi da vero neofita (se e' troppo complicato potete non rispondermi, mi interessa di piu' l'uso della struttra sopra).

1) Suppongo che l'ifndef serva a fare il modo che il codice venga
eseguito solo la prima volta. Ma di preciso cosa accade? Cioe' se io ho 10 files, e tutti quanti hanno l'inclusione del file qui sotto, accadra' che il primo che lo include definisce il __BSGUI_CHECKBOXES_H_INCLUDED__ e gli altri 9 che lo includono si troveranno questa variabile (globale?) gia' definita e non lo leggeranno? Se si, il compilatore dove andra' a prendere i dati che gli occorrono, per i 9 files rimanenti?

2) Che significa

DataManager<bool>

??

Ciao e grazie...ah, ecco il codice che non capisco:




#ifndef __BSGUI_CHECKBOXES_H_INCLUDED__
#define __BSGUI_CHECKBOXES_H_INCLUDED__

struct Checkbox : public Control
{
char *caption;
bool hover;
bool pushed;
DataManager<bool> checked;

Checkbox(Control *parent, int x1, int y1, int x2, int y2,char *caption);
virtual ~Checkbox();

virtual void setCaption(char *newCaption);

virtual void render();

virtual void setState(bool checked);

virtual void onMouseDown(int x, int y, int b);
virtual void onMouseUp(int x, int y, int b);
virtual void onMouseEnter();
virtual void onMouseExit();
};

#endif

newbie
19-12-2005, 11:29
Effettivamente la dichiarazione è quella di una classe, anche se c'è scritto "struct". Forse il compilatore su cui è stato sviluppato il codice permette cose sporche del genere... Secondo me, converrebbe scriverci "class", perchè di solito le struct hanno solo attributi, e non metodi o costruttori.

Se poi ti si compila anche così, tanto meglio...

zaxis
19-12-2005, 11:42
Quindi e' sbagliato???
Strano me la avevano indicata come una libreria ben scritta...
Non e' che e' un qualche uso avanzatissimo delle struct??

oregon
19-12-2005, 12:11
In C una struttura puo' essere costituita solamente da attributi.

In C++ non e' così. Una struct si puo' comportare come una classe.
L'unica differenza è che nella struttura, per default, i membri sono pubblici, in una classe sono privati.

La scrittura e' quindi corretta.

zaxis
19-12-2005, 12:39
Ah...ok...quindi e' un modo piu (semplice?) di dichiarare una classe...

Grazie.

E riguardo gli altri due punti? Qualcuno ha tempo di spiegarmi la cosa?

Ciao!

newbie
19-12-2005, 13:46
A questo punto ha ragione Oregon, scrivere "struct" è accettato dal compilatore (secondo me una struct simile a una classe confonde le idee...)

Per quanto riguarda gli altri due punti:

1) Gli altri nove file non caricheranno più l'header, perchè sarà già stato caricato la prima volta. In Visual C++ esiste una soluzione più pulita, la direttiva "#pragma once", che indica al compilatore di caricare un dato header una sola volta (gli altri file che ne hanno bisogno lo troveranno già caricato).

2) DataManager<bool> indica un tipo "contenitore", cioè la cui definizione contiene un tipo di dato definibile dall'utente. Un esempio famoso è list<int>, che indica una lista contenente numeri interi.

zaxis
19-12-2005, 16:09
Grazie!!!
Abbiate pazienza con un principiante...!
Ciao,

Zax

Loading