В вопросе говорится, что вы используете Managed C ++, а теги говорят, что вы используете C ++ / CLI (доступно в VS 2005 или более поздней версии). С C ++ / CLI у вас, вероятно, будет меньше путаницы.
Если это то, что вы используете, то есть два способа «перевода» из C #. Предположим, у вас есть немного C #:
// Construct
MyClass c = new MyClass();
// Call some method
c.MyMethod();
Console.Writeline(c); // will call ToString on MyClass
// Finished with it
c.Dispose();
Вы можете написать это на C ++ / CLI так:
MyClass ^c = gcnew MyClass;
// Call some method
c->MyMethod();
Console.Writeline(c); // will call ToString on MyClass
// Finished with it
c->Dispose();
Переменная c
называется «дескриптором», а не указателем, объявленным с помощью ^ вместо *. Также мы должны использовать gcnew
вместо new
. Это то же самое, что и ссылочная переменная в C #, и аналогично (но не идентично) указателю в C ++, поэтому мы используем ->
для доступа к членам.
Или вы можете написать это так:
// Create with local scope
MyClass c;
// Call some method
c.MyMethod();
Console.Writeline(%c); // will call ToString on MyClass (note the %)
Первое, на что нужно обратить внимание: мы объявляем это в стиле локальной переменной C ++. Нет необходимости явно gcnew
объект. Во-вторых, мы рассматриваем объект как локальную переменную (или ссылку C ++ на такую переменную). Итак, мы используем. вместо ->
. В-третьих, мы можем «преобразовать» этот локальный объект в дескриптор, добавив к нему префикс %
, который действует как .NET-эквивалент &
, который мы используем с обычными указателями. Это означает «взять адрес» или «дать мне указание» на объект. Наконец, нам не нужно вызывать Dispose
для объекта. Компилятор делает это для нас в конце области, в которой мы его объявили, поскольку метод Dispose
- это механизм, с помощью которого деструкторы реализуются в C ++ / CLI.