2015-04-01 35 views
0

最簡單的方式爲我解釋這是什麼我試圖在即時通訊比較熟悉,C#語言做了一個例子:通行證現有對象構造函數或構建一個新的

public class ServerLib { 
    private SoftwareSerial _bt; 
    private string _name, _game; 

    public ServerLib(int rx, int tx, string name, string game) { 
     _bt = new SoftwareSerial(rx, tx); 
     _bt.begin(9600); 
     _name = name; 
     _game = game; 
    } 

    public ServerLib(ref SoftwareSerial bt, string name, string game) { 
     _bt = bt; 
     _name = name; 
     _game = game; 
    } 
} 

我試圖做到這一點的一個Arduino庫(所以我認爲C++),並嘗試以下操作:

class ServerLib { 
    public: 
     ServerLib(int rx, int tx, String name, String game); 
     ServerLib(SoftwareSerial serial, String name, String game); 
    private: 
     SoftwareSerial _bt; 
     String _name; 
     String _game; 
}; 


ServerLib::ServerLib(int rx, int tx, String name, String game) : _bt(rx, tx) { 
    _name = name; 
    _game = game; 

    _bt.begin(9600); 
} 

ServerLib::ServerLib(SoftwareSerial serial, String name, String game) : _bt(serial) { 
    _name = name; 
    _game = game; 
} 

這將編譯,但只有第一個構造函數的作品,如果我用第二個所有企圖使用SoftwareSerial似乎什麼都不做。 如果我註釋掉第一個構造函數和更換,第二個與

ServerLib::ServerLib(SoftwareSerial& serial, String name, String game) : _bt(serial) {} 

而且字段更改爲SoftwareSerial& _bt那麼這個構造函數將正常工作,但我不能設法得到它與兩個構造編譯。如果我把它看作是我的錯誤:

error: invalid initialization of reference of type 'SoftwareSerial&' from expression of type 'int' 

改變第一構造函數

ServerLib::ServerLib(int rx, int tx, String name, String game) : _bt(SoftwareSerial(rx, tx)) {} 

錯誤與

error: invalid initialization of non-const reference of type 'SoftwareSerial&' from an rvalue of type 'SoftwareSerial' 

我想的最後一件事是移動初始化內第一個構造如下:

ServerLib::ServerLib(int rx, int tx, String name, String game) { 
    _bt = SoftwareSerial(rx, tx); 
    _bt.begin(9600); 
} 

但是這會導致

error: uninitialized reference member 'ServerLib::_bt' [-fpermissive] 
+0

您遇到的錯誤與您上傳的代碼不符。你怎麼調用構造函數? – g24l 2015-04-01 10:03:49

+0

爲什麼'_bt'是你真實代碼中的一個參考? C++中的「引用」與C#中的「引用」是完全不同的。他們只是碰巧用同一個詞命名。 – molbdnilo 2015-04-01 10:23:00

+0

我發佈的錯誤是在這些行上,我將構造函數稱爲「ServerLib服務器(10,11,」name「,」game「);'或'ServerLib服務器(bt,」name「,」遊戲「) ;''SoftwareSerial bt(10,11);' – Goz3rr 2015-04-01 10:24:39

回答

0

在C#中你被引用,但在C++中這其實是一份通過串行。所以你得到一個全新的Serial對象,大概不是「開放」的。

我會做_bt一個std :: unique_ptr,用_bt = std :: make_unique創建它,然後像這樣(用std :: move)傳遞它,或者在其他地方使用std :: shared_ptr。

+0

是的我想到了很多,我試圖將它作爲參考傳遞的原因是因爲ServerLib對象窺探到SoftwareSerial以查看它是否應該處理任何字節,如果沒有的話,它會使實際的代碼無法處理緩衝區中的內容。 – Goz3rr 2015-04-01 10:26:41

+0

如果你使_bt成爲一個智能指針,你可以爲它返回一個const引用(或指針)給它,在構造函數中用std :: move傳入一個,或者在你的其他構造函數中用std :: make_unique自己創建一個。 – Robinson 2015-04-01 10:31:24

相關問題