PDA

Visualizza la versione completa : [C++] Prototipi diversi con lo stesso nome...


xshell
13-03-2009, 19:31
Buonasera.

Ho due dubbi riguardo a questo codice:



class NomeClasse;

typedef unsigned int nometipo;

class NomeClasse
{
public:

//Inizializzazione
Prototipo();
Prototipo(char c);
Prototipo(char c, int i);
Prototipo(const char *str);
...
}


I miei dubbi sono:

1. Non capisco perché nell'esempio venga scritto "class NomeClasse;" all'inizio... a che serve? A caricare i typedef? Serve per "pre-caricare la classe"? E per quale motivo?

2. Nell'inizializzazione della classe mi ritrovo con dei prototipi con lo stesso nome ma che accettano argomenti diversi... quello che non capisco è: come fa il compilatore a non confondersi? "Acchiappa" al volo il prototipo che accetta gli argomenti come quelli che gli sono stati passati? Oppure serve a qualche altra cosa che non sò?

Grazie in anticipo.

oregon
13-03-2009, 20:11
Originariamente inviato da xshell
1. ...

In questo esempio specifico, non serve a nulla.

Ma, nel caso di programmi complessi con molti file, i vari include possono richiedere una predichiarazione della classe con quella linea ...


2. ...

L' overload e' una caratteristica fondamentale della programmazione OOP (e del C++).

In questo caso l'overload e' dei costruttori. Ne esistono tanti, diversi per i parametri che accettano. Il compilatore semplicemente controlla il numero e il tipo dei parametri prima di decidere quale usare (non "al volo", ma a "compile time").

xshell
13-03-2009, 21:11
Originariamente inviato da oregon
In questo esempio specifico, non serve a nulla.

Ma, nel caso di programmi complessi con molti file, i vari include possono richiedere una predichiarazione della classe con quella linea ...

Non ho inserito tutto il codice perché è lungo, però ho provato a compilare il codice con Visual Studio togliendo quella linea e gli errori che mi segnala riguardano i vari typedef successivi... che definiscono tipi utilizzati nella classe. Gli include sono <cstring>, <climits>, <vector> e <cstdlib>... quindi non credo che le funzioni in essi contenute abbiano bisogno di un precaricamento della classe...


Originariamente inviato da oregon
L' overload e' una caratteristica fondamentale della programmazione OOP (e del C++).

In questo caso l'overload e' dei costruttori. Ne esistono tanti, diversi per i parametri che accettano. Il compilatore semplicemente controlla il numero e il tipo dei parametri prima di decidere quale usare (non "al volo", ma a "compile time").

Questo più o meno lo immaginavo, anche se avevo bisogno di una conferma. Quindi sarà il compilatore che deciderà quale costruttore utilizzare in base all'occorrenza, giusto?

oregon
13-03-2009, 21:18
Originariamente inviato da xshell
Non ho inserito tutto il codice perché è lungo

Ma e' solo vedendo tutto il codice che si capisce il problema ...

Gli errori che manifesta un compilatore possono essere molto fuorvianti, specialmente quelli successivi al primo e possono non avere nulla a che fare con il vero problema.

Esamina attentamente il primo errore.


Questo più o meno lo immaginavo ...

Non andare per "suggerimenti" su questi argomenti ... leggi un buon libro e dedica un po' di tempo alle teoria ...

xshell
14-03-2009, 00:43
Originariamente inviato da oregon
Ma e' solo vedendo tutto il codice che si capisce il problema ...

Gli errori che manifesta un compilatore possono essere molto fuorvianti, specialmente quelli successivi al primo e possono non avere nulla a che fare con il vero problema.

Esamina attentamente il primo errore.

Il codice è siffatto:

1. Inclusioni file di intestazione della biblioteca standard C++
2. Predichiarazione classe
3. Typedef per tre tipi
4. Definizione classe

(Il file è un header che definisce una classe per la gestione di testo in un parser Python)

Se elimino il punto 2, tutti gli errori che il compilatore mi segnala si riferiscono ai tipi di dato non definiti dai typedef (come se i typedef immediatamente successivi alla predichiarazione della classe fossero stati ignorati). Ad esempio:


Error 1:
error C4430: missing type specifier - int assumed.
Note: C++ does not support default int
Error 2:
error C2143: syntax error : missing ';' before '&'
Error 3
error C2530: 'RCString' : references must be initialized
...

(Gli altri errori sono identici)... RCString ad esempio è un tipo di dato definito da typedef


Originariamente inviato da oregon
Non andare per "suggerimenti" su questi argomenti ... leggi un buon libro e dedica un po' di tempo alle teoria ...

Saggio consiglio. Ho letto un libro, Fondamenti di Programmazione C++, Deitel & Deitel, e anche qualche cosa sul C, ma purtroppo l'ho fatto alcuni anni fa e io ho una memoria abbastanza labile: adesso avrei dovuto rileggere tutto, ma ho preferito andare in cerca di codici, anche complessi, per esaminarli da cima a fondo, aiutandomi col libro (anche se non riesco a trovare tutto).


----------------------------------

Non vorrei sfruttare troppo la tua grande disponibilità, ma ho un'ultima curiosità: perché è necessario utilizzare semplici typedef solo per cambiare nome ad un tipo già esistente? Come il size_t definito in cstring...

typedef unsigned int size_t;

Qual'è il vantaggio?

Grazie ancora.

oregon
14-03-2009, 00:58
Originariamente inviato da xshell
Il codice è siffatto:


Ascolta ... non so perche' tu non voglia mostrare il codice ma senza vederlo, non si puo' dire molto ...


perché è necessario utilizzare semplici typedef solo per cambiare nome ad un tipo già esistente? Come il size_t definito in cstring...

typedef unsigned int size_t;


Beh, leggi questo

http://www.disi.unige.it/person/DoderoG/LP/typed.htm

xshell
14-03-2009, 22:44
Originariamente inviato da oregon
Beh, leggi questo

http://www.disi.unige.it/person/DoderoG/LP/typed.htm
Grazie

Loading