指向托管类成员的指针

时间:2016-07-05 22:26:42

标签: c# c++-cli

首先,我必须提到我不是一名高级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<array<Byte>^, int> ^DataHandler);

和我的

public ref class Sensor

我宣布:

int Processing(array<Byte>^ 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 个答案:

答案 0 :(得分:0)

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

类似的东西:

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