CLR中函数引用传递无法使用ref class成员变量的问题

    之前遇到过这个问题,今天又被人问到了,所以研究了一下。

    1、问题描述:

           在CLR项目中的ref class中,想将函数的返回值放在函数的输入参数列表中,于是使用了函数的引用传递:

           函数声明:

           bool GetVideoInfo(int & duration,int & fps,int & totalF,System::String^ & VideoType,bool & IsOpencv,System::String^ & daynight,,int & VideoGrey);

           函数定义:

           bool VideoBriefControl::GetVideoInfo(int & duration,int & fps,int & totalF,System::String^ & VideoType,bool & IsOpencv,System::String^ & daynight,,int & VideoGreyt);

           函数调用:

           bool isActive = GetVideoInfo(duration,fps,totalF,VideoType,IsOpencv,daynight,VideoGrey);

           七个参数均为引用传递,发现这些参数必须是函数变量,而不能是类成员变量,否则会报错:


1>VideoBriefControl.cpp(209): error C2664: 'VideoBrief::VideoBriefControl::GetVideoInfo' : cannot convert parameter 8 from 'int' to 'int &'
1>          An object from the gc heap (member of a managed class) cannot be converted to a native reference

    2、问题分析:

          猜测一:上述函数引用传递方式属于C++,不适用于托管类的类函数变量传递;(可能性较大)

          猜测二:引用变量必须初始化,而ref class中类成员变量不能初始化;

   

    3、问题解决:

          方法一:使用OUT参数,借鉴在C++/CLI,如何使用 Out 传回参数?

PACKAGE_T1^        PreFixSplit( [System::Runtime::InteropServices::Out] PACKAGE_T2^ %destHeader, [System::Runtime::InteropServices::Out]array<byte>^    %destData, array<byte>^    sourceData );


          方法二:使用ref参数,借鉴

ref and out in C++/CLI

主要用在Managed C++做Native C++ Wrapper时,

void foo(Bar^% x); => void foo(ref Bar x); 


using namespace System::Runtime::InteropServices;    
void foo([Out] Bar^% x); => void foo(out Bar x);

          
          不能使用指针传递,因为C#里已经没有指针概念了,所以在托管代码里,也不能使用指针传递。

    4、问题延伸:学习const引用

今日看到如下一段,应该是很经典的对于const的分析:

C++对函数的参数不区分输入参数和输出参数,而且经常由于一个返回值不够用,我们会传递几个引用或指针来接收返回值。我们可以用const来标明某参数为输入参数,函数内不会改变此参数的值,如下面一个函数:

bool CopyClass(Value & dest, const Value & src);

  其中,Value为用户定义的类,CopyClass函数的功能为拷贝src的内容到dest,src为输入参数,其值不能被改变,dest为输出参数,其他程序员根据函数的定义,就能对函数的功能有个清晰的了解。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值