Come ordinare le intestazioni nei progetti .NET C ++
Domanda
Sto cercando di creare un nuovo progetto .NET C ++ da zero. Sto progettando di mescolare codice gestito e non gestito in questo progetto.
questo thread del forum IDataObject: errore simbolo ambiguo risponde a un problema che ho visto più volte.
Stati n. 4 " Sposta tutto 'usando lo spazio dei nomi XXXX' da .h a .cpp "
sembra una buona idea, ma ora nei miei file di intestazione devo fare riferimento a parametri di .NET Framework come
void loadConfigurations(String^ pPathname);
Come posso spostarmi usando le istruzioni nel file .cpp e usare gli spazi dei nomi corrispondenti nel file .h?
Soluzione
È una buona idea usare sempre nomi completi nei file di intestazione. Poiché l'istruzione using
influisce su tutto il codice seguente indipendentemente da #include
, l'inserimento di un'istruzione <=> in un file di intestazione influisce su tutti coloro che potrebbero includere tale intestazione.
Quindi cambieresti la tua dichiarazione di funzione nel tuo file header in:
void loadConfigurations(SomeNamespace::String^ pPathname);
dove SomeNamespace è il nome dello spazio dei nomi che eri <=> in precedenza.
Altri suggerimenti
Non so molto su .NET, quindi la mia risposta si applica solo alla parte c ++ non gestita della tua domanda. Personalmente, questo è uno dei motivi principali che evito come la peste & Quot; usando lo spazio dei nomi XXXX; & Quot; dichiarazioni.
Preferisco essere esplicito con spazi dei nomi come " std :: cout < < " ciao mondo " lt &; lt &; std :: endl; quot &;
Questo evita collisioni nello spazio dei nomi e non c'è mai alcuna ambiguità su da dove provenga qualcosa. Inoltre, quando fai qualcosa come & Quot; usando lo spazio dei nomi std; & Quot; stai quasi annullando ciò che ti danno gli spazi dei nomi. Sono stati progettati per evitare le collisioni e importando tutto nel globale, è sufficiente invitare nuovamente le collisioni.
Questa è rigorosamente una questione di opinioni e gusti.
Per quanto riguarda cosa fare nelle intestazioni, scrivo solo cose come questa: " void f (const std :: string & amp; s); "
Per risolvere questo, l'ho fatto nel file .h:
namespace TestClassNS
{
class TestClass;
}
e poi nel file .cpp aggiungerei #h. in cui si trovava TestClass e lì farei lo spazio dei nomi usando TestClassNS.
Il mio C ++ è arrugginito, quindi potrebbe esserci un modo migliore.
Nella mia esperienza, l'unico spazio dei nomi di cui devi stare attento è il Sistema stesso. È un po 'fastidioso che il più comune, il più importante sia quello in cui trovi problemi, ma questa è la vita.
Almeno puoi conforto che se stai creando classi gestite, i tuoi problemi con include otterranno sollievo alla barriera dell'assemblaggio, a differenza dei problemi con i file di intestazione per le classi non gestite.