2013-08-05 18 views
7

In C, dobbiamo usare un prefisso struct ogni volta che vogliamo dichiarare o definire una struttura. Tuttavia, le cose sono state cambiate una volta che la struttura è diventata una specie di classe in C++. Non abbiamo più bisogno di usare un prefisso struct quando dichiariamo una struttura. In questo senso, immagino che il tag della struttura in C sia diventato un nome di un tipo in C++.Non riesco a capire la dichiarazione della struttura in C++

Tuttavia, ciò non significa che non è possibile utilizzare un prefisso struct. Possiamo ancora utilizzare un prefisso struct. Ad esempio, Bjarne Stroustrup, il creatore di C++, introduce un esempio di dichiarazione di una struttura con e senza prefisso struct, il che mi rende perplesso.

Di seguito sono riportate le definizioni di struttura che tentano di creare una struttura con argomento modello T. Queste vengono compilate correttamente senza errori.

template<class T> struct linked_list { 
    T element; 
    linked_list<T> *next; 
}; 
template<class T> struct linked_list { 
    T element; 
    struct linked_list<T> *next; 
}; 

Ora, di seguito sono riportate le dichiarazioni di funzione il cui tipo di ritorno e tipo di argomento sono strutture. Anche se questi non sono molto diverse da quanto sopra, il primo dal basso due dichiarazioni di funzione, quello con un prefisso struct, mi dà un errore con Visual Studio C++ 2012

template<class T> struct linked_list<T> *add_list(T element, struct linked_list<T> *tail); 
template<class T> linked_list<T> *add_list(T element, linked_list<T> *tail); 

Io davvero non capisco come le cose funzionano Non capisco le differenze tra queste dichiarazioni. Qualcuno potrebbe darmi una spiegazione dettagliata?

+1

Stai chiedendo perché puoi omettere la parola chiave 'struct' in C++? [Perché C ha bisogno della parola chiave "struct" e non del C++?] (Http://stackoverflow.com/questions/8422775/why-does-c-need-struct-keyword-and-not-c) – Blastfurnace

+0

Che compilatore sei usando? Non tutti i C++ sono conformi agli standard. – Anycorn

+1

@ Blastfurnace Grazie. Tuttavia, ho ancora una domanda. Il link che mi hai dato ha detto che se non c'è ambiguità il C++ 'permette' l'omissione della parola chiave struct. Significa che possiamo ancora usare la parola chiave struct. Ne consegue che c'è un'ambiguità nei miei secondi codici perché mi dà un errore. Tuttavia, non vedo alcuna ambiguità. Cosa c'è che non va? – isbae93

risposta

4

Oltre che in C, in C++ la parola chiave struct (e class) può essere omessa, se non vi è ambiguità. Se c'è un'ambiguità, è ancora necessario utilizzare la parola chiave struct. Un esempio noto è POSIX 'stat: c'è un struct stat e una funzione stat. Qui devi sempre usare struct stat per fare riferimento al tipo.

-1

Sembra che tu capisca molto bene come lo spieghi tu stesso. In C++ la struttura della parola chiave è la stessa della classe parola chiave ma con un valore predefinito di membri pubblici anziché privati. Quindi, dopo aver dichiarato una classe usando la parola chiave struct, non la si usa più quando si fa riferimento a quella classe. Sembra che tu stia cercando di usare struct come verrebbe usato in C nel primo esempio. Questo è solo diverso per C++.

+0

Quindi, sei fondamentalmente riassunto la sua domanda – jrok

+0

Tuttavia, è possibile che usiamo un prefisso struct anche dopo la definizione di una struttura.Possiamo vedere questo nel mio primo codice.È così complicato :-( – isbae93

+0

Non è davvero complicato è solo che C++ è una lingua diversa da C. La parola chiave struct significa qualcosa di diverso: Objective-C è un'estensione di C, quindi tutto C rimane valido, ma Stroustrup ha deciso di non mantenere tale compatibilità verso il basso durante la progettazione di C + + –

Problemi correlati