Perché utilizzare uno typedef class {} Name
?Uso classe C++ typedef
Ho imparato questo in IBM C++ doc, nessun suggerimento da utilizzare qui.
Perché utilizzare uno typedef class {} Name
?Uso classe C++ typedef
Ho imparato questo in IBM C++ doc, nessun suggerimento da utilizzare qui.
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++.
Grazie! che dire dei benefici in C? quello descritto solo da Steve Jessop? – octoback
È possibile ereditare da 'Pt' –
Si dice ancora" non fornisce alcun meccanismo per l'ereditarietà " –
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.
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
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
@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]). –
Legacy from C. Do not use. –
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. –
@IvayloStrandjev - d'accordo, stavo solo scrivendo lo stesso. Questo è davvero brutto e non necessario e sono piuttosto sorpreso, che è usato nel documento di IBM. –