在看effective c++時(shí)遇到智能指針shared_ptr,在一個(gè)類中使用時(shí)出現(xiàn)問(wèn)題,具體的代碼見下:
結(jié)果如圖所示檀何,在lock類中聲明了一個(gè)shared_ptr<int> m_p;但是在lock的構(gòu)造函數(shù)中卻初始化不了shared_ptr<int> m_p击敌。
首先坐搔,需要明確一點(diǎn)内列,那就是智能指針帶處理函數(shù)的初始化方法,如:
int m = 5;
void func(int &m){//......}
shared_ptr<int> m_p(&m,func);
以上是初始化一個(gè)智能指針m_p,其帶有一個(gè)后續(xù)處理的函數(shù)func,這個(gè)函數(shù)的實(shí)參是&m寄啼。
簡(jiǎn)單地了解這個(gè)之后纽哥,我們回歸正題钠乏,根據(jù)這個(gè)智能指針的初始化方法,可以確定在lock類中進(jìn)行如此初始化是可以的春塌,那為什么還報(bào)錯(cuò)晓避?
是因?yàn)榇藭r(shí)智能指針m_p的處理函數(shù)是一個(gè)類中的成員函數(shù)unlock,且傳給智能指針的也是一個(gè)函數(shù)指針只壳,但是要調(diào)用成員函數(shù)的話俏拱,是需要通過(guò)類的實(shí)例對(duì)象來(lái)進(jìn)行的,而在智能指針中調(diào)用的時(shí)候吼句,是沒有這個(gè)實(shí)例對(duì)象存在的锅必,結(jié)果就掛了。
參考:http://stackoverflow.com/questions/22513680/non-static-member-function-must-be-called