2013-03-19 33 views
10

Perché utilizzare uno typedef class {} Name?Uso classe C++ typedef

Ho imparato questo in IBM C++ doc, nessun suggerimento da utilizzare qui.

+6

Legacy from C. Do not use. –

+1

Personalmente non penso che questa domanda meriti i downvotes. Consiglio anche di non usarlo, ma è una domanda giusta. Forse la spiegazione ** perché ** farebbe meglio qui. –

+0

@IvayloStrandjev - d'accordo, stavo solo scrivendo lo stesso. Questo è davvero brutto e non necessario e sono piuttosto sorpreso, che è usato nel documento di IBM. –

risposta

22

Questa è una sbornia dalla lingua "C".

In C, se si dispone di

struct Pt { int x; int y; }; 

poi dichiarare una variabile di questa struct, è necessario fare

struct Pt p; 

Il typedef ha aiutato a evitare questo in C

typedef struct { int x; int y; } Pt; 

Ora puoi fare

Pt p; 

in C.

In C++, questo non è mai necessario perché

class Pt { int x; int y; }; 

permesso di fare

Pt p; 

Esso fornisce benefici di notazione in C++ come in C. OTOH, porta a restrizioni perché questa sintassi non fornisce alcun meccanismo per la costruzione o la distruzione.

Ad esempio, non è possibile utilizzare il nome typedef name nel costruttore o nel distruttore.

typedef class { int x; int y; } Pt; 

Non è possibile avere un costruttore chiamato Pt, né un distruttore. Quindi in sostanza, la maggior parte delle volte, non dovresti farlo in C++.

+0

Grazie! che dire dei benefici in C? quello descritto solo da Steve Jessop? – octoback

+0

È possibile ereditare da 'Pt' –

+0

Si dice ancora" non fornisce alcun meccanismo per l'ereditarietà " –

3

Questa risposta presuppone che ci siano contenuti interessanti nella classe, non solo {}.

In C++, è possibile avere una funzione con lo stesso nome di una classe (per compatibilità con C), ma praticamente non si desidera.

Non è possibile avere una funzione con lo stesso nome di typedef, quindi fare ciò protegge da scelte di nome non disciplinate. Praticamente nessuno si preoccupa, e anche se avete intenzione di fastidio sarebbe probabilmente scriverlo:

class Name {}; 
typedef Name Name; // reserve the name 

Se il codice a cui ti riferisci è davvero come scritto (non vedo seguendo la vostra link), quindi è piuttosto come class Name {}; (che è una cosa particolare da scrivere, perché chiameresti una classe vuota Name?), ma modificata per la considerazione di cui sopra.

+0

Non avevo idea di questo trattamento speciale dei nomi typedef. Grood per sapere! Inoltre, trovo sorprendente e forse disturbante il fatto che 'typedef A A;' è permesso. – Agentlien

+0

Dopo aver giocato un po 'con esso, vedo che molti compilatori sembrano implementarlo come descritto, ma non riesco a trovare la sezione pertinente nello standard. Pensi di poterti aiutare con un riferimento? – Agentlien

+0

@Agentlien: è un trattamento speciale dei nomi delle classi piuttosto che dei typedef. Il bit rilevante in C++ 11 è 3.3.10/2 ([basic.scope.hiding]). –