指向托管类成员的指针
本文关键字:成员 指针 | 更新日期: 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);