拷贝构造和赋值操作符,C#和本机 C++ 代码的互用性
本文示例源代码下载
我有一个简单的 C++问题。我想让我的拷贝构造函数和赋值操作做同样的事情。你能告诉我最佳实现方法吗?
Shadi Hani乍一看,这似乎是一个答案简单的简单问题:写一个调用 operator= 的构造函数不就行了: Figure 4 互用性途径 如果 C++ 类太复杂,你碰到的最大的互用性问题将会是本地和托管类型之间的参数转换问题,这个过程称为封送(marshaling)。托管扩展所做的一个令人赞誉的工作是使这一过程尽可能轻松(例如,自动转换原始数据类型和字符串String),但有时你必须了解自己正在做什么。 例如,你不能在没有固定(pinning)住托管对象或嵌入对象的前提下,将其地址传递给本地函数。那是因为托管对象存在于托管堆中,垃圾收集器在托管堆中可以随意重整对象。如果垃圾收集器移动某个对象,它能更新所有针对该对象的托管引用——但它对托管环境以外的原始指针一无所知。那就是 __pin 的作用之所在;它告诉垃圾收集器:不要移动这个对象。对于字符串来说,框架有一个专门的函数 PtrToStringChars,返回一个被固定住的本地字符指针。(顺便提一下,对于那些好奇者来说,PtrToStringChars 是到目前为止定义在<vcclr.h>文件中的唯一一个函数)。其代码如下:CFoo::CFoo(cborder="0" alt="拷贝构造和赋值操作符,C#和本机 C++ 代码的互用性(图一)" width="164" height="135" />// PtrToStringChars, from vcclr.h我在 MPerson 中使用 PtrToStringChars 来设置Name,详细代码参见 Figure 3。
// get an interior gc pointer to the first character contained in a
// System::String object
//
inline const System::Char * PtrToStringChars(const System::String *s) {
const System::Byte *bp = reinterpret_cast<const System::Byte *>(s);
if( bp != 0 ) {
unsigned offset = System::Runtime::CompilerServices::
RuntimeHelpers::OffsetToStringData;
bp += offset;
}
return reinterpret_cast<const System::Char*>(bp);
}
指针固定并不是你将遇到的仅有的互用性问题。如果你要处理数组,引用,结构和回调,或者存取某个对象中的嵌入对象,还会碰到其它的问题。这是一些将来要讨论的更高级的技术,如:StructLayout,框入/框出(boxing),__value 类型等等。你还需要专门的代码来处理异常(本地或托管)以及回调/委托。但不要让这些户用性细节遮住了大方向。首先确定你的调用方式(是从托管调用本地还是从本地调用托管),如果你是从托管调用本地,是使用 P/Invoke 还是包装器。
Visual Studio 2005 中(有些人已经开始用beta版了),托管扩展已更名并升级到 C++/CLI。你可以把 C++/CLI 看成是 Managed Extensions Version 2,或者是 Managed Extensions 演变成的一个什么。这个改变几乎都是语法上的,虽然也有一些重要的语义变化。总体上讲,C++/CLI 是设计用来突出而不是模糊托管和本地对象间的差异。使用托管对象的指针语法是明智的想法,但最终也许做的有些过于明智,因为它淡化了托管和本地对象之间的重要差异。C++/CLI 引入了一个处理托管对象的关键概念,CLI 处理托管对象时使用 ^(读作 hat)来代替 C 语言的指针语法:// handle to managed string
String^ s = gcnew String;
正像你已经明确注意到的,还有一个 gcnew 操作符用以来表示你是在托管堆中分配对象,而不是在本地分配。这样做有一个额外的好处是 gcnew 不会与 C++ 的 new 发生冲突,它能被重载或者甚至被重定义成一个宏。C++/CLI 有许多其它很棒的特性,专门用来使互用性尽可能简单明了。
进入讨论组讨论。- 最新文章
- C++ Builder初学问与答10[01-03]
- 如何在C/C++使用内联汇编[英文版][01-03]
- 初级 WINDOWS API C++语言版 编程(2)[01-03]
- 用 C++ 创建简单的 Win32 服务程序(2)[01-03]
- C++程序员快速学习C#之二[01-03]
- C++程序员快速学习C#之一[01-03]
- 相关文章
