指向托管 class 成员的指针
Pointer to managed class member
首先,我必须说明我不是高级 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;
}
class MySerialPort
有以下成员:
public Func<byte[], int> DataHandler;
而 Sensor
class 有以下成员:
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
有两个 public 成员:
Sensor ^sensor;
MySerialPort ^mySerialPort;
和一个public方法:
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);
首先,我必须说明我不是高级 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;
}
class MySerialPort
有以下成员:
public Func<byte[], int> DataHandler;
而 Sensor
class 有以下成员:
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
有两个 public 成员:
Sensor ^sensor;
MySerialPort ^mySerialPort;
和一个public方法:
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);