2009-05-27 6 views
0

J'ai créé une application en C++ géré. Lorsque j'essaie d'instancier, il montre une erreur carpouvons-nous accéder au code managé avec l'objet pointeur out?

ne peut pas convertir d'obj en * obj. quand je instancie comme obj de pointeur il ne montre aucune erreur.

ainsi. est-il possible d'accéder à cette classe sans créer d'objet pointeur?

+0

Pourriez-vous ajouter un extrait de code pour montrer ce que vous voulez dire un peu plus clairement? – mikelong

+0

Veuillez supprimer la balise C# .net. – mikelong

+0

C# retiré des étiquettes. Question suivante: est-ce C++ géré (comme dans le texte de la question) ou C++/CLI (comme dans les balises)? Ils sont deux choses complètement différentes et changent totalement l'interprétation de la question. –

Répondre

0

Vous pouvez le créer sur la pile.

MyObject foo; 
foo.bar(); // accessing bar method on object foo 

Peut-être la syntaxe que vous cherchez est ceci:

MyObject *foo = new MyObject; 
foo->bar; 
2

La question dit que vous utilisez Managed C++, et les balises que vous utilisez C++/CLI (disponible dans VS 2005 ou plus tard). Vous aurez probablement moins de confusion avec C++/CLI.

Si c'est ce que vous utilisez, il y a deux façons de "traduire" depuis C#. Supposons que vous ayez une C#:

// Construct 
MyClass c = new MyClass(); 

// Call some method 
c.MyMethod(); 

Console.Writeline(c); // will call ToString on MyClass 

// Finished with it 
c.Dispose(); 

Vous pouvez écrire en C++/CLI comme ceci:

MyClass ^c = gcnew MyClass; 

// Call some method 
c->MyMethod(); 

Console.Writeline(c); // will call ToString on MyClass 

// Finished with it 
c->Dispose(); 

La c variable est appelée une "poignée", pas un pointeur, a déclaré avec^au lieu de *. Nous devons également utiliser gcnew au lieu de new. C'est la même chose qu'une variable de référence en C#, et est analogue (mais pas identique) à un pointeur en C++, donc nous utilisons -> pour accéder aux membres.

Ou vous pouvez l'écrire comme ceci:

// Create with local scope 
MyClass c; 

// Call some method 
c.MyMethod(); 

Console.Writeline(%c); // will call ToString on MyClass (note the %) 

La première chose à noter: nous déclarons dans le style de la variable C un local. Il n'y a pas besoin d'explicitement gcnew l'objet. Deuxièmement, nous traitons l'objet comme s'il s'agissait d'une variable locale (ou d'une référence C++ à une telle variable). Donc nous utilisons. au lieu de ->. Troisièmement, nous pouvons "convertir" cet objet local en un handle, en le préfixant avec %, qui agit comme l'équivalent .NET de & que nous utilisons avec des pointeurs ordinaires. Cela signifie "prenez l'adresse de" ou "donnez-moi un coup de main" à un objet. Enfin, nous ne devons pas appeler Dispose sur l'objet. Le compilateur fait cela pour nous à la fin de la portée dans laquelle nous l'avons déclaré, car la méthode Dispose est le mécanisme par lequel les destructeurs sont implémentés en C++/CLI.

+0

puis-je faire cela Console.WriteLine (c.ToString()); ?? –

+0

Oui, si c est un objet (comme dans le troisième exemple de code). ToString() renvoie un handle (System.String ^) qui est ce que WriteLine accepte. Si c est un handle, vous devez mettre c-> ToString(). –

Questions connexes