指向托管类成员的指针

Posted

技术标签:

【中文标题】指向托管类成员的指针【英文标题】:Pointer to managed class member 【发布时间】:2016-07-05 22:26:42 【问题描述】:

首先,我必须指出,我不是高级 C++/C# 程序员。我必须用 C++ 做一个项目,其中我必须(在一个单独的线程中)用串行端口(COMx)上的数据填充一个循环缓冲区。我做了一些研究,但我发现了很多用 C# 编写的代码。所以我使用了 C++ CLR(因为据我了解,我可以访问 .net 命名空间)。

我在网上搜索了一些用 C# 编写的示例,如果我有两个不同类型的对象,我可以使用指向另一个对象方法的指针:

private void btnInit_Click(object sender, RoutedEventArgs e)
    
        _sensorInstance = new Sensor();
        _mySerialPort = new MySerialPort();
        _mySerialPort.DataHandler = _sensorInstance.Processing;         
    

MySerialPort 类有以下成员:

public Func<byte[], int> DataHandler;

Sensor 类具有以下成员:

 public int Processing(byte[] bytes)
    
     int l = bytes.Length;
     //code
     return l;
    

代码编译没有错误。

现在我尝试在 C++ 中做类似的事情。

在我的public ref class MySerialPort

我声明:

Func&lt;array&lt;Byte&gt;^, int&gt; ^DataHandler);

在我的

public ref class Sensor

我声明:

int Processing(array&lt;Byte&gt;^ bytes);

那我还有一个public ref class MyProject

有两个公共成员:

Sensor ^sensor;
MySerialPort ^mySerialPort;

还有一个公共方法:

void Init()


    _sensor = gcnew Sensor();
    _mySerialPort = gcnew MySerialPort("COM3", 9600, 500, 500);
    _serialPort->DataHandler = _sensor->Processing;


int main()中调用:myProjectObject.Init(); 在构建过程中,我收到以下两个错误:

Error   1   error C3867: 'Sensor::Processing': function call missing argument list; use '&Sensor::Processing' to create a pointer to member

Error   2   error C2440: '=' : cannot convert from 'int (__clrcall Sensor::* )(cli::array<unsigned char,1> ^)' to 'System::Func<cli::array<unsigned char,1> ^,int> ^'   

我不明白如何解决这个问题以及为什么在 C# 中可以做到这一点,但在 C++ 中却不行。

我希望我的长问题不会打扰任何人,也许有人会解释我缺少什么。

最好的问候,

数字锁定

【问题讨论】:

【参考方案1】:

在 C++ 中,没有从函数名到 Func 或委托的隐式转换。您必须显式调用委托类型构造函数才能从函数创建 Func 对象。

类似的东西:

_serialPort->DataHandler = 
    gcnew Func<array<Byte>^, int>(_sensor, & Sensor::Processing);

【讨论】:

以上是关于指向托管类成员的指针的主要内容,如果未能解决你的问题,请参考以下文章

错误:'指向成员的指针对托管类无效'

通过“指向类成员的指针”访问作为数组的类成员

指向成员的指针对托管类无效

类成员指针

通过指向派生类的指针访问派生成员变量

为啥指向基类的派生类指针可以调用派生类成员函数? [复制]