指向托管类成员的指针

本文关键字:成员 指针 | 更新日期: 2023-09-27 17:55:00

首先,我必须说明我不是一个高级的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++中做一些类似的事情。

In my public ref class MySerialPort

我宣布:

Func<array<Byte>^, int> ^DataHandler);

public ref class Sensor

我声明:

int Processing(array<Byte>^ bytes);

然后是另一个public ref class MyProject

有两个public成员:

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++中却不行。

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

最诚挚的问候,

时键盘上的

指向托管类成员的指针

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

像这样:

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