问题的标题简单明了。这是代码:
class xxx : public Scheduled
{
long int _wait_time;
boost::function< void() > _cb;
mutable boost::mutex _mutex;
public:
xxx(boost::function< void() > callback, unsigned int wait_time = 10000000)
:_wait_time(wait_time),_cb(callback)
,Scheduled(Timer(_wait_time, 0))
{
this->stop();
}
};
虽然我尊重初始化的顺序,但这是我得到的警告:
---: In constructor ‘xxx::xxx(boost::function<void ()()>, unsigned int)’:
---: warning: ‘xxx::_cb’ will be initialized after
---: warning: base ‘Scheduled’
---: warning: when initialized here
有什么想法?谢谢
答案 0 :(得分:2)
您正在初始化派生类成员,因为您构造了基类。
xxx(boost::function< void() > callback, unsigned int wait_time = 10000000)
:_wait_time(wait_time),_cb(callback) <- derived class memebers
,Scheduled(Timer(_wait_time, 0)) <- Base class
{
this->stop();
}
在C ++中,必须在初始化派生类的成员之前构造基类。所以警告告诉你,即使在派生成员之后你有基类初始化,它也会首先构造基类。
如果您将代码更改为
xxx(boost::function< void() > callback, unsigned int wait_time = 10000000)
:Scheduled(Timer(wait_time, 0))
^ use wait_time instead of _wait_time
,_wait_time(wait_time),
,_cb(callback)
{
this->stop();
}
您不应再收到警告。
答案 1 :(得分:1)
基类构造函数必须是初始化列表中的第一个:
xxx(boost::function< void() > callback, unsigned int wait_time = 10000000)
:Scheduled(Timer(_wait_time, 0))
,_wait_time(wait_time),
,_cb(callback)
{
this->stop();
}
答案 2 :(得分:0)
添加到其他答案:
如果初始化程序的顺序与它们在班级中出现的顺序不同,则可能会出现此警告。
示例:
struct A { .. };
struct B { .. };
struct C
{
A a;
B b;
C(..) : a(..), b(..) {} // OK
C(..) : b(..), a(..) {} // Wreorder-warning
};