【问题标题】:warning: derived class's member variable is initialized after base class警告:派生类的成员变量在基类之后初始化
【发布时间】:2015-10-16 15:39:20
【问题描述】:

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

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

有什么想法吗?谢谢

【问题讨论】:

    标签: c++ boost-function


    【解决方案1】:

    在构造基类之前,您正在初始化派生类成员。

    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();
    }
    

    您不应再收到警告。

    【讨论】:

    • 谢谢,但是如果基类初始化依赖于派生成员呢?例如,您纠正了我的等待时间。如果_wait_time 是一个在提供给基类​​之前必须初始化的类怎么办?
    • @rahman 那你的设计就坏了。基类必须在类的任何非静态成员之前初始化。在基类初始化之前,派生类成员都没有被初始化,所以你会使用垃圾值。
    【解决方案2】:

    基类构造函数必须是初始化列表中的第一个:

    xxx(boost::function< void() > callback, unsigned int wait_time = 10000000)
    :Scheduled(Timer(_wait_time, 0))
    ,_wait_time(wait_time),
    ,_cb(callback)
    {
        this->stop();
    }
    

    【讨论】:

      【解决方案3】:

      添加到其他答案:
      如果您的初始化程序的顺序与它们在类中出现的顺序不同,则可能会出现此警告的另一个原因。

      例子:

      struct A { .. };
      struct B { .. };
      struct C
      {
          A a;
          B b;
          C(..) : a(..), b(..) {}  // OK
          C(..) : b(..), a(..) {}  // Wreorder-warning
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-08
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 2010-11-10
        • 2019-01-25
        • 1970-01-01
        • 2014-04-17
        相关资源
        最近更新 更多