2015-10-16 81 views
0

問題的標題很簡單。這裏是代碼:警告:派生類的成員變量在基類後初始化

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 

有什麼想法?謝謝

回答

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

你應該不會再得到一個警告。

+0

謝謝,但如果一個基類的初始化依賴於派生成員呢?比如你糾正了我的等待時間。如果'_wait_time'是一個在被提供給base之前必須被初始化的類呢? – rahman

+0

@rahman然後你的設計被打破了。基類必須在類的任何非靜態成員之前初始化。在基類初始化之前,沒有任何派生類成員已經初始化,因此您將使用垃圾值。 – NathanOliver

1

基類的構造函數必須在初始化列表中的第一個:

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