мы можем получить доступ к управляемому коду без объекта указателя? - PullRequest
0 голосов
/ 27 мая 2009

Я создал какое-то приложение в управляемом c ++. Когда я пытаюсь создать экземпляр, он показывает ошибку как

не может конвертировать из obj в * obj. когда я создаю экземпляр как указатель obj, он не показывает ошибки.

так. Есть ли способ получить доступ к такому классу без создания объекта указателя

Ответы [ 2 ]

2 голосов
/ 27 мая 2009

В вопросе говорится, что вы используете 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.

0 голосов
/ 27 мая 2009

Вы можете создать его в стеке.

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

Возможно, вы ищете следующий синтаксис:

MyObject *foo = new MyObject;
foo->bar;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...