我们可以使用指针对象访问托管代码吗?

时间:2009-05-27 05:19:52

标签: .net c++-cli

我在托管c ++中创建了一些应用程序。当我尝试实例化时,它显示错误为

无法从obj转换为* obj。当我实例化为指针obj时,它没有显示错误。

如此。有没有办法访问这样的类而不创建指针对象

2 个答案:

答案 0 :(得分:2)

问题是你正在使用托管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中实现析构函数的机制。

答案 1 :(得分:0)

您可以在堆栈上创建它。

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

也许您正在寻找的语法是:

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