2010-05-14 24 views
15

Così, mi sono imbattuto in una firma del metodo interessante che io non capisco, è andato lungo le linee di:C++, classe come parametro a un metodo, non template da

void Initialize(std::vector<std::string> & param1, class SomeClassName * p); 

quello che non lo faccio capire è la parola chiave "class" utilizzata come parametro, perché è lì? È necessario specificare o è puramente superficiale?

+0

ho visto questo anche in un membro della classe dichiarazione e stavo impazzendo cercando di scoprire cosa significasse. 'class Foo { private: class Bar * pointerToBar; } ' – Vicro

risposta

16

È una dichiarazione anticipata della classe. È effettivamente lo stesso di

class SomeClassName; 
void Initialize(std::vector<std::string> & param1, SomeClassName * p); 

Esistono molte situazioni in cui è utile una dichiarazione di inoltro; c'è un intero elenco di cose che puoi e non puoi fare con una dichiarazione in avanti in this answer to another question).

+0

funge da dichiarazione anticipata? – ra170

+0

@ ra170: Sì, lo fa. –

+1

"ma è necessario utilizzare un puntatore o un riferimento a un'istanza della classe" -> Se si dispone solo di una dichiarazione di funzione non definizione come in questo caso, si può andare bene con i parametri di valore, però. –

1

Non è superficiale. Permette di specificare "SomeClassName" come parametro anche se "SomeClassName" non è stato ancora definito.

+0

funziona come dichiarazione preventiva? – ra170

1

Più superficiale. In C, quando si definisce una struttura:

struct x { 
    int member; 
    char member2; 
}; 

Per utilizzare questo, è necessario utilizzare struct x whatever. Se si desidera utilizzare x come un nome di per sé (senza il struct precede) è necessario utilizzare un typedef:

typedef struct x { 
    int member; 
    char member2; 
} x; 

In C++, tuttavia, la prima (senza il typedef) ha più o meno lo stesso effetto di il secondo (entrambi definiscono x in modo da poterlo utilizzare da solo, senza che sia struct precedente). In C++, uno class è essenzialmente lo stesso di struct, tranne che per impostazione predefinita è private anziché public (sia per i membri che per l'ereditarietà).

L'unico posto in cui c'è una differenza è se non esiste una definizione dello class nell'ambito di applicazione nel punto della dichiarazione della funzione.

0

è la stessa come si scrive:

for(int i=0;i<10;i++) 

come

int i; 
for(i=0;i<10;i++) 

la dichiarazione della classe è una definizione e un puntatore ad esso

+0

l'ambito della variabile i è diverso. – iOS

+0

Non risponde alla domanda originale. – prapin

Problemi correlati