对我来说,最简单的解释方法就是用一种我更熟悉的语言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 :(得分:0)
在C#中,您通过引用传递Serial,但在C ++中,这实际上是一个副本。所以你得到的是一个全新的Serial对象,大概不是“开放”的。
我会使_bt成为std :: unique_ptr,使用_bt = std :: make_unique创建它并像那样传递(使用std :: move)或使用std :: shared_ptr(如果需要在别处使用它)。