Assumere someClass
è una classe definita in C# con qualche metodo int doSomething(void)
e, per semplicità, fornire un costruttore che non accetta argomenti. Poi, in C#, le istanze devono essere create sul mucchio gc:Confuso: creazione di istanza della classe C# in C++
someClass c; // legit, but only a null pointer in C#
// c->doSomething() // would not even compile.
c = new someClass(); // now it points to an instance of someclass.
int i = c->doSomething();
Ora, se someClass
è compilato in qualche libreria Net, è possibile utilizzarlo anche in C++/CLI:
someClass^ cpp_gcpointer = gcnew someClass();
int i = cpp_gcpointer->doSomething();
Così facile! Nifty! Questo naturalmente presuppone che un riferimento alla libreria .Net sia stato aggiunto al progetto e che sia stata fatta una corrispondente dichiarazione di utilizzo.
È a mia conoscenza che questo è l'equivalente C++/CLI del precedente esempio C# (condensato su una singola riga, questo non è il punto che mi interessa). Corretta? (Scusate, sono nuovo al tema)
In C++, tuttavia, anche
someClass cpp_cauto; // in C++ declaration implies instantiation
int i = cpp_cauto.doSomething();
è sintassi valida. Per curiosità, ci ho provato oggi. Un collega, che mi guardava alle spalle, era disposto a scommettere che non sarebbe stato nemmeno compilato. Avrebbe perso la scommessa. (Questa è ancora la classe dal gruppo C#). In realtà produce anche lo stesso risultato i
come il codice degli esempi precedenti.
Nifty, anche, ma - uhmm - cosa è esattamente, cosa viene creato qui? La mia prima ipotesi è stata che dietro la mia schiena, .Net crea dinamicamente un'istanza sull'heap gc e è una specie di wrapper per questo oggetto, che si comporta in modo sintattico come un'istanza della classe someClass
. Ma poi ho trovato questa pagina
http://msdn.microsoft.com/en-us/library/ms379617%28v=vs.80%29.aspx#vs05cplus_topic2
Questa pagina sembra dirmi, che (almeno, se someClass fosse una classe C++) cpp_auto
è in realtà creato nello stack, che, a mia conoscenza, sarebbe lo stesso comportamento che si ottiene nel classico C++. E qualcosa che non puoi fare in C# (non puoi, puoi?). Cosa mi piacerebbe sapere: l'istanza dall'assembly C# viene anche creata nello stack? Puoi produrre binari .Net in C++ con istanze di classe nello stack che non puoi creare in C#? E questo forse potrebbe anche darti un guadagno in perfomance :-)?
Cordiali saluti,
Thomas
Ouch. Quindi ho trovato la risposta senza riconoscerla. Grazie per avermelo fatto notare :-) – Thomas
@Thomas Nessun problema. È una pagina grande - devi sapere cosa cercare lì dentro per trovare la discussione sul trucco del compilatore;) –
Grazie ancora, ma beh, vedi, non è perché è una pagina grande. Il punto è che capisco la citazione solo dopo che mi hai fatto notare che risponde alla mia domanda. Ma forse questa è solo l'ignoranza dei principianti. E poi, ovviamente, l'ignoranza è beatitudine :-) – Thomas