我们可以在没有指针对象的情况下访问托管代码吗?

发布于 2024-07-21 17:55:19 字数 134 浏览 3 评论 0原文

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

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

所以。 有没有办法在不创建指针对象的情况下访问此类

i have created some application in managed c++.when i try to instantiates it shows error as

cannot convert from obj to *obj. when i instantiates as pointer obj it shows no error.

so. is there any way to access such class without creating pointer object

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

韬韬不绝 2024-07-28 17:55:19

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

The question says you're using Managed C++, and the tags say you're using C++/CLI (available in VS 2005 or later). You'll probably have a less confusing time with C++/CLI.

If that's what you're using, then there are two ways to "translate" from C#. Suppose you have some C#:

// Construct
MyClass c = new MyClass();

// Call some method
c.MyMethod();

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

// Finished with it
c.Dispose();

You can write this in C++/CLI like this:

MyClass ^c = gcnew MyClass;

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

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

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

The variable c is called a "handle", not a pointer, declared with ^ instead of *. Also we have to use gcnew instead of new. This is the same thing as a reference variable in C#, and is analogous (but not identical) to a pointer in C++, so we use -> to access members.

Or you can write it like this:

// Create with local scope
MyClass c;

// Call some method
c.MyMethod();

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

First thing to note: we declare it in the style of a local C++ variable. There is no need to explicitly gcnew the object. Secondly, we treat the object as if it was a local variable (or a C++ reference to such a variable). So we use . instead of ->. Thirdly, we can "convert" this local object into a handle, by prefixing it with %, which acts like the .NET equivalent of & that we use with ordinary pointers. It means "take the address of" or "give me a handle to" an object. Finally, we don't have to call Dispose on the object. The compiler does that for us at the end of the scope in which we declared it, as the Dispose method is the mechanism by which destructors are implemented in C++/CLI.

川水往事 2024-07-28 17:55:19

您可以在堆栈上创建它。

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

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

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

You could create it on the stack.

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

Maybe the syntax you are looking for is this:

MyObject *foo = new MyObject;
foo->bar;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文