将现有对象传递给构造函数或构造一个新对象

时间:2015-04-01 09:48:20

标签: c++ arduino

对我来说,最简单的解释方法就是用一种我更熟悉的语言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]

1 个答案:

答案 0 :(得分:0)

在C#中,您通过引用传递Serial,但在C ++中,这实际上是一个副本。所以你得到的是一个全新的Serial对象,大概不是“开放”的。

我会使_bt成为std :: unique_ptr,使用_bt = std :: make_unique创建它并像那样传递(使用std :: move)或使用std :: shared_ptr(如果需要在别处使用它)。