CLR中函数引用传递无法使用ref class成员变量的问题
来源:互联网 发布:流体动力学软件 编辑:程序博客网 时间:2024/05/22 18:22
之前遇到过这个问题,今天又被人问到了,所以研究了一下。
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++对函数的参数不区分输入参数和输出参数,而且经常由于一个返回值不够用,我们会传递几个引用或指针来接收返回值。我们可以用const来标明某参数为输入参数,函数内不会改变此参数的值,如下面一个函数:
bool CopyClass(Value & dest, const Value & src);
其中,Value为用户定义的类,CopyClass函数的功能为拷贝src的内容到dest,src为输入参数,其值不能被改变,dest为输出参数,其他程序员根据函数的定义,就能对函数的功能有个清晰的了解。
- CLR中函数引用传递无法使用ref class成员变量的问题
- C# 函数引用传递(址传递)ref、out以及值传递之间的运行效率问题
- 递归函数使用引用传递的问题
- TPtr类型的成员变量无法在构造函数中赋值的问题
- PHP类中成员变量和函数的引用
- 关于java中对于成员变量的引用问题
- 在C++中使用引用类型的成员变量
- java 中何时考虑成员变量和局部变量的作用域,何时考虑值传递及引用传递?
- C++/CLR ref class 中 int 类型的几种区别
- 使用引用成员变量
- class中成员变量的初始化
- class 的static成员变量和 static 成员函数
- 关于MFC中成员函数引用CDC的问题
- C++ 类成员引用变量的使用
- C++ 类成员引用变量的使用
- C++中线程函数中方访问成员变量的问题
- 在线程函数中使用主窗口的成员变量
- Perl函数参数中传递数组和引用的使用
- Singleton<T>
- 自定义Android对话框
- LCD1602 -- STC
- Awk的使用
- 网关,默认网关,自动网关,路由,网关与路由器的关系
- CLR中函数引用传递无法使用ref class成员变量的问题
- 安装好android的adt以后重启eclipse,但是没有创建AVD的图标
- 排序算法(一)-希尔排序
- OGRE手札-31 从3Dmax导出动画文件
- STL算法------查找5
- 黑马程序员——File类、Properties、打印流、合并流、切割流
- 欢迎使用CSDN-markdown编辑器
- iOS用户点击推送消息进入应用后,如何跳转到对应的ViewController
- eclipse 相关