警告:派生类的成员变量在基类之后初始化

时间:2015-10-16 15:39:20

标签: c++ boost-function

问题的标题简单明了。这是代码:

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

有什么想法?谢谢

3 个答案:

答案 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
};