2016-07-05 50 views
0

首先,我必須提到我不是高級的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++中。

我希望我的長問題不會打擾任何人,也許有人會解釋我失去了什麼。

此致

數字鎖定

回答

0

在C++中,有從函數名的函數功能或代表的隱式轉換。您必須顯式調用委託類型構造函數以從該函數創建Func對象。

類似的東西:

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