2013-03-03 6 views
5

मैं 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 का एक ही व्यवहार है, और यदि मैं संदर्भ गैर-कॉन्स करता हूं, तो बूस्ट लाइब्रेरी शिकायत करती है कि फ़ंक्शन हटा दिया गया है।

+2

मुझे यकीन नहीं है कि आपको सूचक होने की आवश्यकता क्यों है ... क्या आपका मतलब है 'std :: shared_ptr m_mv_ab' इसके बजाय? क्या आप चाहते हैं कि 'std :: shared_ptr' स्वयं का आधार हो या वह ऑब्जेक्ट जो यह इंगित कर रहा हो? –

+1

आप * किसी भी * 'const' डेटा सदस्य के साथ असाइनमेंट नहीं कर सकते हैं। यह 'shared_ptr' के लिए विशिष्ट नहीं है। – juanchopanza

उत्तर

11

वहाँ अपने कोड से किसी भी कारण से घोषित करने के लिए होने के लिए प्रतीत नहीं होता m_mv_ab रूप

const std::shared_ptr<MoveAbility> m_mv_ab; 

जिनमें से स्मार्ट सूचक संस्करण है: गैर निरंतर के लिए

MoveAbility * const m_mv_ab; 

(निरंतर सूचक MoveAbility)

आप MoveAbility वस्तु की ओर इशारा किया-संशोधित करने के लिए नहीं करना चाहते हैं और यह const होना चाहते हैं, यो यू करना चाहिए:

std::shared_ptr<const MoveAbility> m_mv_ab; 

जिनमें से स्मार्ट सूचक संस्करण है: (के लिए निरंतर MoveAbility गैर निरंतर सूचक)

const MoveAbility * m_mv_ab; 

इस थोड़ा अधिक सहज ज्ञान युक्त आप उपयोग कर सकते हैं बनाने के लिए const हमेशा प्रत्यय के रूप में और हमेशा सही-से-बाएं पढ़ते हैं, सिवाय इसके कि std::shared_ptr<X> "(स्मार्ट) एक्स को पॉइंटर" पढ़ा जाता है:

std::shared_ptr<MoveAbility> const m_mv_ab; // const ptr to non-const MoveAbility 
MoveAbility * const m_mv_ab; // const ptr to non-const MoveAbility 

std::shared_ptr<MoveAbility const> m_mv_ab; // non-const ptr to const MoveAbility 
MoveAbility const * m_mv_ab; // non-const ptr to const MoveAbility 

लेकिन जब भी संभव हो, अधिकांश लोग const उपसर्ग के रूप में उपयोग करते हैं, जो इसे भ्रमित कर देता है।

+1

क्या एक गूंगा गलती है; मुझे विश्वास नहीं है कि मुझे याद आया। इस पर ध्यान दिलाने के लिए धन्यवाद। – Brad

+0

@ ब्रैड हर समय होता है, यह सहज नहीं है –

संबंधित मुद्दे