मैं boost :: filtered_graph में उपयोग के लिए अपनी खुद की कस्टम फ़िल्टर क्लास बना रहा हूं। वेटमैप अवधारणा में एक डिफ़ॉल्ट कन्स्ट्रक्टर, कॉपी कन्स्ट्रक्टर और असाइनमेंट ऑपरेटर होना चाहिए।असाइनमेंट ऑपरेटरों में एक std :: shared_ptr असाइन करना
मैंने नीचे दिया गया वर्ग बनाया है, जिसमें std :: shared_ptr निजी सदस्य है। मेरा सवाल यह है कि मुझे असाइनमेंट ऑपरेटर कैसे लिखना है। कॉपी कन्स्ट्रक्टर कोई समस्या नहीं थी, लेकिन असाइनमेंट ऑपरेटर काम नहीं करता है।
class BFDMFilter
{
private:
const BGraph* m_battlemap;
const std::shared_ptr<MoveAbility> m_mv_ab;
public:
BFDMFilter() : m_battlemap(nullptr), m_mv_ab() { }
BFDMFilter(const BGraph* bmap, std::shared_ptr<MoveAbility> mv) : m_battlemap(bmap), m_mv_ab(mv) { }
BFDMFilter(const BFDMFilter& filter) : m_battlemap(filter.m_battlemap), m_mv_ab(filter.m_mv_ab) { }
BFDMFilter& operator=(const BFDMFilter& filter)
{
if(this != &filter)
{
m_battlemap = filter.m_battlemap;
m_mv_ab = filter.m_mv_ab;
}
return *this;
}
bool operator()(const Edge& edge) const
{
Tile::TileEdge path = (*m_battlemap)[edge];
return m_mv_ab->CanMove(path.TerrainType()) > 0.0;
}
bool operator()(const Vertex& vertex) const
{
Tile tile = (*m_battlemap)[vertex];
return m_mv_ab->CanMove(tile.TerrainType()) > 0.0;
}
};
कौन सा फिर मुझे एक संकलन त्रुटि देता है:
error: passing ‘const std::shared_ptr<momme::battle::MoveAbility>’ as ‘this’ argument of ‘std::shared_ptr<_Tp>& std::shared_ptr<_Tp>::operator=(std::shared_ptr<_Tp>&&) [with _Tp = momme::battle::MoveAbility, std::shared_ptr<_Tp> = std::shared_ptr<momme::battle::MoveAbility>]’ discards qualifiers [-fpermissive]
मुझे समझ में क्यों; जब असाइनमेंट करता है तो असाइनमेंट ऑपरेटर share_ptr की संदर्भ गणना को संशोधित करता है, ताकि यह ट्रैक कर सके कि कितने खुले संदर्भ हैं। लेकिन फिर, मैं असाइनमेंट ऑपरेटर कैसे लिखूं? std :: weak_ptr का एक ही व्यवहार है, और यदि मैं संदर्भ गैर-कॉन्स करता हूं, तो बूस्ट लाइब्रेरी शिकायत करती है कि फ़ंक्शन हटा दिया गया है।
मुझे यकीन नहीं है कि आपको सूचक होने की आवश्यकता क्यों है ... क्या आपका मतलब है 'std :: shared_ptr m_mv_ab' इसके बजाय? क्या आप चाहते हैं कि 'std :: shared_ptr' स्वयं का आधार हो या वह ऑब्जेक्ट जो यह इंगित कर रहा हो? –
आप * किसी भी * 'const' डेटा सदस्य के साथ असाइनमेंट नहीं कर सकते हैं। यह 'shared_ptr' के लिए विशिष्ट नहीं है। – juanchopanza