我在托管c ++中创建了一些应用程序。当我尝试实例化时,它显示错误为
无法从obj转换为* obj。当我实例化为指针obj时,它没有显示错误。
如此。有没有办法访问这样的类而不创建指针对象
答案 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;