CLI/C++中混合类的使用【转】
http://www.cppblog.com/mzty/archive/2007/12/24/39517.html
CLI/C++中混合类的使用
一 混合类
所谓混合类是指CLI/C++中native的Class中可以包含CLR对象,CLR的class也可以包含Naitve的对象。
1)native的class中包含CLR对象,必须通过gcroot<>或auto_gcroot<>。
2)CLR中的class中包含native的对象,必须是指针,也可以使用高手写的CAutoNativePtr智能指针。
注意:C#中不能调用CLI/C++中的Native的class。同样Native C++中也不能调用CLI/C++中的Ref的class。
二 实例
高手的CAutoNativePtr类:
Author : Nishant Sivakumar
Email : voidnish@gmail.com
Blog : http://blog.voidnish.com
Web : http://www.voidnish.com 
You may freely use this class as long as you include
this copyright.
You may freely modify and use this class as long
as you include this copyright in your modified version. 
This code is provided "as is" without express or implied warranty.
Copyright ?Nishant Sivakumar, 2006.
All Rights Reserved.
***/
#pragma once
template<typename T> ref class CAutoNativePtr
{
private:
T* _ptr;
public:
CAutoNativePtr() : _ptr(nullptr)
{
}
CAutoNativePtr(T* t) : _ptr(t)
{
}
CAutoNativePtr(CAutoNativePtr<T>% an) : _ptr(an.Detach())
{
}
template<typename TDERIVED>
CAutoNativePtr(CAutoNativePtr<TDERIVED>% an) : _ptr(an.Detach())
{
}
!CAutoNativePtr()
{
delete _ptr;
}
~CAutoNativePtr()
{
this->!CAutoNativePtr();
}
CAutoNativePtr<T>% operator=(T* t)
{
Attach(t);
return *this;
}
CAutoNativePtr<T>% operator=(CAutoNativePtr<T>% an)
{
if(this != %an)
Attach(an.Detach());
return *this;
}
template<typename TDERIVED>
CAutoNativePtr<T>% operator=(CAutoNativePtr<TDERIVED>% an)
{
Attach(an.Detach());
return *this;
}
static T* operator->(CAutoNativePtr<T>% an)
{
return an._ptr;
}
static operator T*(CAutoNativePtr<T>% an)
{
return an._ptr;
}
T* Detach()
{
T* t = _ptr;
_ptr = nullptr;
return t;
}
void Attach(T* t)
{
if(t)
{
if(_ptr != t)
{
delete _ptr;
_ptr = t;
}
}
else {#ifdef _DEBUG throw gcnew Exception( "Attempting to Attach() a nullptr!");#endif } } void Destroy() { delete _ptr; _ptr = nullptr; }};测试实例之CLI/C++文件:

#pragma once
#include <string>
#include <iostream>
#include <gcroot.h>
#include <msclr/auto_gcroot.h>
#include "AutoNative.h"
using namespace System;
namespace MixedNativeAndCLIDLL {
public class NativeClass
{
public:
int *pX;
NativeClass(){pX = new int(10);}
~NativeClass()
{
if(pX != NULL)
{
delete pX;
pX = NULL;
}
}
};
public ref class RefClass
{
public:
int x;
RefClass(){x = 20;}
};
public class MixedClass0
{
public:
NativeClass nativeClass;
//RefClass refClass; // error c3265 and error c3149
gcroot<RefClass^> refClass1;
std::string nativeStr;
//System::String refStr; // error c3265 and error c3149
gcroot<System::String^> refStr1;
MixedClass0()
{
refClass1 = gcnew RefClass();
refStr1 = gcnew System::String("i am a native class mixed some clr members.\n");
}
~MixedClass0()
{
delete refClass1;
delete refStr1;
}
void PrintSelf()
{
System::Console::WriteLine("my name is MixedClass0");
System::Console::WriteLine(refClass1->x);
System::Console::WriteLine(refStr1);
}
};
public class MixedClass1
{
public:
NativeClass nativeClass;
//RefClass refClass; // error c3265 and error c3149
msclr::auto_gcroot<RefClass^> refClass1;
std::string nativeStr;
//System::String refStr; // error c3265 and error c3149
msclr::auto_gcroot<System::String^> refStr1;
MixedClass1()
{
refClass1 = gcnew RefClass();
refStr1 = gcnew System::String("i am a native class with some clr members.\n");
}
~MixedClass1()
{
// no need to delete. } void PrintSelf() { System::Console::WriteLine("my name is MixedClass1"); System::Console::WriteLine(refClass1->x); System::Console::WriteLine(refStr1); } }; public ref class MixedClass2 { public: //NativeClass nativeClass; // error c4368 NativeClass * nativeClass1; RefClass^ refClass; //std::string nativeStr; // error c4368 std::string *nativeStr1; System::String^ refStr; // MixedClass2() { nativeClass1 = new NativeClass(); nativeStr1 = new std::string("i am a clr class with some native members.\n"); } ~MixedClass2() { delete nativeClass1; delete nativeStr1; } !MixedClass2(){} void PrintSelf() { System::Console::WriteLine("my name is MixedClass2"); std::cout<<*(nativeClass1->pX)<<std::endl; std::cout<<*nativeStr1<<std::endl; } }; public ref class MixedClass3 { public: //NativeClass nativeClass; // error c4368 CAutoNativePtr<NativeClass> nativeClass1; RefClass^ refClass; //std::string nativeStr; // error c4368 CAutoNativePtr<std::string> nativeStr1; System::String^ refStr; // MixedClass3() { nativeClass1 = new NativeClass(); nativeStr1 = new std::string("i am a clr class with some native members.\n"); } ~MixedClass3(){} !MixedClass3(){} void PrintSelf() { System::Console::WriteLine("my name is MixedClass3"); std::cout<<*(nativeClass1->pX)<<std::endl; std::cout<<*nativeStr1<<std::endl; } };}测试实例之C#调用文件:
using System.Text;
namespace CsharpTest
{
class Program
{
static void Main(string[] args)
{
MixedNativeAndCLIDLL.MixedClass0 mixedClass0 = new MixedNativeAndCLIDLL.MixedClass0();
//mixedClass0.PrintSelf();
MixedNativeAndCLIDLL.MixedClass1 mixedClass1 = new MixedNativeAndCLIDLL.MixedClass1();
//mixedClass1.PrintSelf();
MixedNativeAndCLIDLL.MixedClass2 mixedClass2 = new MixedNativeAndCLIDLL.MixedClass2();
mixedClass2.PrintSelf();
MixedNativeAndCLIDLL.MixedClass3 mixedClass3 = new MixedNativeAndCLIDLL.MixedClass3();
mixedClass3.PrintSelf();
}
}
}
三 代码下载
CLI/C++中混合类的使用【转】的更多相关文章
- JS中定义类的方法
JS中定义类的方式有很多种: 1.工厂方式 function Car(){ var ocar = new Object; ocar.color = "blue" ...
- sass中 混合宏 VS 继承 VS 占位符 各自的使用时机和特点
初学者都常常纠结于这个问题“什么时候用混合宏,什么时候用继承,什么时候使用占位符?”其实他们各有各的优点与缺点,先来看看他们使用效果: a) Sass 中的混合宏使用 举例代码见 2-24 行 编译出 ...
- css编译工具Sass中混合宏,继承,占位符分别在什么时候使用
//SCSS中混合宏使用 @mixin mt($var){ margin-top: $var; } .block { @include mt(5px); span { display:block; @ ...
- JS中定义类的方法<转>
转载地址:http://blog.csdn.net/sdlfx/article/details/1842218 PS(个人理解): 1) 类通过prototype定义的成员(方法或属性),是每个类对象 ...
- Python中的类属性、实例属性与类方法、静态方法
1.什么是类对象,实例对象 类对象:类名 实例对象:类创建的对象 2.类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,这个和C++.Java中类的静态成员变量有点 ...
- Processing中PImage类和loadImage()、createImage()函数的相关解析
聊一聊Processing中PImage类和loadImage().createImage()函数.因为要借P5做多媒体创意展示,图片是一个很重要的媒体.有必要就图片的获取和展放作总结. 首先 有一点 ...
- 11.mixins混合类
一.混合类(mixins) 使用基于类的视图,最大的优势之一就创建可复用的代码 我们编写的非常类似的代码,可以抽象出来,将这部分代码放到mixin类系列中,然后作为父类提供子类继承使用 from ...
- Python中的类、对象、继承
类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...
- 基础知识(05) -- Java中的类
Java中的类 1.类的概念 2.类中的封装 3.对象的三大特征 4.对象状态 5.类与类之间的关系 ------------------------------------------------- ...
随机推荐
- RSA进阶之共模攻击
适用场景: 同一个n,对相同的m进行了加密,e取值不一样. e1和e2互质,gcd(e1,e2)=1 如果满足上述条件,那么就可以在不分解n的情况下求解m 原理 复杂的东西简单说: 如果gcd(e1, ...
- win7装python3.6提示api-ms-win-runtime-1-1-0.dll丢失
win7为MSDN下的旗舰版,没有servicepack1那个,刚开始安装python3.6提示必须得安装servicepack1,于是乎到微软官网下了个900mb大小的安装包. https://ww ...
- Robotium接入到Jenkins持续集成自动化测试
6.3 将测试用例接入到Jenkins 由于我是自己学习的手机自动化测试,没有实际投入到工作中使用,jenkins的接入也没有具体操作,现摘抄一下网页:http://www.tuicool.com/a ...
- c++ primer 读书笔记
顺序容器:为程序提供控制元素存储和访问顺序的能力,这种顺序与元素加入到容器时的位置相对应,而与元素值无关. 另外还有根据关键字的值来存储元素的容器:有序.无序关联容器. 另外STL还有三种容器适配器, ...
- Spring Cloud Eureka简单入门
步骤: 1.创建父工程 2.创建EurekaServer工程 3.创建EurekaClient工程 父工程pom.xml <?xml version="1.0" encodi ...
- 树中两个结点的最低公共祖先--java
题目:对于任意一个树,不仅仅限于二叉树,求树中两个结点的最低公共祖先结点. 解析:对于任意一棵树,显然并不局限于二叉树,也就是说树的非叶子结点可能存在多个子节点.所以,我们可以定义两个链表结构,存储这 ...
- [BZOJ2036]聪明的阿卑多
[BZOJ2036]聪明的阿卑多 试题描述 也许你从没听说过阿卑多,但你一定知道他爷爷的爷爷的爷爷,那就是聪明绝顶的阿凡提先生.是的,阿卑多也是个聪明的小孩. 一天,阿卑多骑着他的小毛驴,在小镇上晃悠 ...
- 论文笔记《Fully Convolutional Networks for Semantic Segmentation》
一.Abstract 提出了一种end-to-end的做semantic segmentation的方法,也就是FCN,是我个人觉得非常厉害的一个方法. 二.亮点 1.提出了全卷积网络的概念,将Ale ...
- python(1)-- 变量类型
常规: Python有五个标准的数据类型: Numbers(数字):数字数据类型用于存储数值.他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象.String(字符串):由数字.字母 ...
- mac 安装 photoshop CS6
终于找到破解了,索性写个图文并茂的全解吧.1. 官方下载photosho CS6 machttp://trials2.stage.adobe.com/A ... hotoshop_13_LS3.dmg ...