我试图实现C 11功能(我已将此答案用作参考
Can I call a constructor from another constructor (do constructor chaining) in C++?).显然,我做错了但我不明白为什么.
我在下面的代码中收到了几条警告:
>成员_output未在此构造函数中初始化
>成员_protocol_scanner未在此构造函数中初始化
>成员_state未在此构造函数中初始化
>成员_source未在此构造函数中初始化
这是代码:
class UartScanner {
public:
UartScanner(periph::IStreamDevice *source, periph::IStreamDevice *output);
UartScanner(periph::IStreamDevice *source);
~UartScanner();
private:
typedef enum
{
WAITING_SYNC,
WAITING_UBLOX_MSG,
WAITING_NOVATEL_MSG
} states_t;
periph::IStreamDevice *_source;
periph::IStreamDevice *_output;
ProtocolScanner *_protocol_scanner;
states_t _state;
};
UartScanner::UartScanner(periph::IStreamDevice *source, IStreamDevice *output):
_source(source),
_output(output),
_state(WAITING_SYNC)
{
_protocol_scanner = new ProtocolScanner(source,output);
}
UartScanner::UartScanner(periph::IStreamDevice *source): UartScanner(source,0)
{
}
class IStreamDevice {
public:
virtual ~IStreamDevice() {}
virtual uint32_t read(uint8_t* data, uint32_t size) = 0;
virtual uint32_t write(const uint8_t* data, uint32_t size) = 0;
};
最佳答案 我看看你的代码,我改变了一些事情.我创建了一个名为Test1.hpp的文件并将代码放入其中.以下代码使用-Wall -Werror -pedantic-errors属性正确编译了GCC 4.7和Clang 3.3.让我们看一下HPP文件包含的内容.
#ifndef TEST1_HPP
#define TEST1_HPP
// Some inclusions here ...
namespace periph
{
class IStreamDevice{ // Something here... };
}
class ProtocolScanner {
public:
ProtocolScanner(periph::IStreamDevice *source, periph::IStreamDevice *output)
: _source(source), _output(output) { }
private:
periph::IStreamDevice *_source;
periph::IStreamDevice *_output;
};
class UartScanner {
public:
UartScanner(periph::IStreamDevice *source, periph::IStreamDevice *output)
: _source(source), _output(output), _protocol_scanner(new ProtocolScanner(source,output)), _state(states_t::WAITING_SYNC) { }
UartScanner(periph::IStreamDevice *source)
: UartScanner(source, nullptr) { }
~UartScanner() { } // I suppose that something is done in the destructor.
private:
enum class states_t : uint8_t {
WAITING_SYNC,
WAITING_UBLOX_MSG,
WAITING_NOVATEL_MSG
};
periph::IStreamDevice *_source;
periph::IStreamDevice *_output;
ProtocolScanner *_protocol_scanner;
states_t _state;
};
class IStreamDevice {
public:
virtual ~IStreamDevice() {}
virtual uint32_t read(uint8_t* data, uint32_t size) = 0;
virtual uint32_t write(const uint8_t* data, uint32_t size) = 0;
};
#endif
请注意,我添加了一个命名空间和您使用的其他一些类.由于我不知道他们的定义,我让他们空了以使其工作.现在,我们来看看这段代码吧.
在C 11中,如果要将指针初始化为NULL,我建议您使用nullptr关键字来完成这项工作. This answer about nullptr应该帮助你理解.
我还替换了以下代码
typedef enum
{
WAITING_SYNC,
WAITING_UBLOX_MSG,
WAITING_NOVATEL_MSG
} states_t;
通过这个(自C 11以来的强类型枚举)
enum class states_t : uint8_t {
WAITING_SYNC,
WAITING_UBLOX_MSG,
WAITING_NOVATEL_MSG
};
A short explanation of the enum class
关于委托构造函数,它似乎是正确的.它应该只在构造函数初始化列表中使用,就像你一样.如果这是问题,您使用的编译器可能不允许您使用委托构造函数.如果您使用的是Visual C,this answer应该可以帮到您.随着GCC 4.7及更高版本以及3.1及更高版本,我确信它正在发挥作用.
希望对你有所帮助.