0

在我的代碼中,我沒有爲複雜和組合類定義複製構造函數。我希望使用由編譯器提供給我的拷貝構造函數複製構造函數需要用互斥量明確定義

#include<boost/make_shared.hpp> 
#include<boost/shared_ptr.hpp> 
#include <boost/thread/mutex.hpp> 

class Complex 
{ 
    private : 
    std::string _a; 
    std::string _b; 
}; 

class Composition 
{ 
    public: 
    Composition(){} 
    Composition(int x, int y) 
    { 
     _x = x; 
     _y = y; 
    } 
    private: 
    int _x; 
    int _y; 
    Complex obj; 
}; 

int main() 
{ 
    //Used make_shared this way on purpose 
    boost::shared_ptr<Composition> ptr = boost::make_shared<Composition>(Composition(1,2)); 
} 

上面的代碼編譯沒有任何問題。

現在我改變了複雜的類如下

class Complex 
{ 
    private : 
    std::string _a; 
    std::string _b; 
    boost::mutex _mutex; 
}; 

當我編譯的代碼,我在定義自己的拷貝構造函數得到錯誤

/usr/local/include/boost/smart_ptr/make_shared.hpp:660: error: no matching function for call to ‘Composition::Composition(const Composition&)’ 
note: candidates are: Composition::Composition(int, int) 
note:     Composition::Composition() 
note:     Composition::Composition(Composition&) 

我有過去的這個問題現在爲空的身體組成。

但是我仍然不確定爲什麼我必須在一個案例中創建自己的拷貝構造函數,並且能夠通過編譯器在另一個案例中生成一個。罪魁禍首當然是互斥體。它是否是互斥體創建此問題的不可複製的屬性還是我錯過的其他東西?

回答

1

this

類互斥

Mutex類是互斥和NonCopyable的模型,並提供了超越這些概念的要求沒有額外 設施。

因爲boost::mutex是NonCopyable,如果您的類包含/繼承它作爲成員,編譯器將不會生成複製構造函數。

相關問題