का एक ptr_map है, मेरे पास boost::ptr_map
है जो अमूर्त बेस क्लास (उदा। VectorWrapperBase) मानों के रूप में संग्रहीत करता है और इससे मुझे विभिन्न प्रकार के वैक्टरों के तारों को मैप करने की अनुमति मिलती है।मैपिंग ऑब्जेक्ट जिसमें अमूर्त बेस क्लासेस
boost::ptr_map<std::string, VectorWrapperBase> memory_map;
//...
memory_map.insert(str_key, new VectorWrapper<T>());
यह काम प्रतीत होता है। हालांकि, जब मेरे पास memory_map
किसी अन्य वर्ग के सदस्य के रूप में है और std::map
में उस वर्ग को स्टोर करने का प्रयास करता है, तो संकलन विफल हो जाता है।
class AgentMemory {
//...
private:
boost::ptr_map<std::string, VectorWrapperBase> memory_map;
};
std::map<std::string, AgentMemory> agent_map;
//...
agent_map.insert(std::pair<std::string, AgentMemory>(agent_name, AgentMemory()));
अंतिम पंक्ति में विफल रहता है के साथ:
/SOMEPATH/boost_1_48_0/boost/ptr_container/clone_allocator.hpp:34
error: cannot allocate an object of abstract type ‘xyz::VectorWrapperBase’
सी ++ के लिए नए होने के नाते, यह चौंकाने है।
मैं संदिग्ध कि त्रुटि मानचित्र प्रविष्टि AgentMemory
वस्तु जो ptr_map
क्लोनिंग शामिल है को कॉपी करने के लिए नीचे है। और चूंकि मेरी VectorWrapper
ऑब्जेक्ट्स cloneable नहीं हैं, इसलिए त्रुटि उठाई गई है।
मेरे प्रश्न हैं:
- मैं त्रुटि क्यों मिल रही? (क्या मेरे संदेह वास्तव में क्या हो रहा है इसके करीब भी हैं?)
- मैं इसे कैसे संबोधित करूं?
संकलन त्रुटि के समाधान के लिए, मैं माना जाता है निम्नलिखित है, लेकिन सी के साथ ज्यादा अनुभव के बिना ++ तय नहीं कर सकता जो अधिक उपयुक्त है:
- शुद्ध विनिर्देशक (
= 0
) निकाल दें, ताकिVectorWrapperBase
है अब कोई सार- यह एक हैक के बाद से
VectorWrapperBase
कभी नहीं instantiated किया जाना चाहिए
- यह एक हैक के बाद से
- VectorWrappers बनाने की तरह लगता है cloneable
- This seems to work, लेकिन मेरे उपयोग के मामले में केवल खाली कंटेनर भीतरी
ptr_map
के भीतर ऐसा VectorWrappers शीर्ष स्तर के नक्शे को सौंपा है क्लोन करने की जरुरत नहीं है। इसलिए क्लोनिबिलिटी केवल कंपाइलर को खुश करने के लिए होगी और वास्तविक उपयोग को प्रतिबिंबित नहीं करती है।
- This seems to work, लेकिन मेरे उपयोग के मामले में केवल खाली कंटेनर भीतरी
- भूल जाओ
ptr_map
और एकstd::map
औरshared_ptr
बजाय का उपयोग करें।- मैं इस समाधान पर कम उत्सुक हूं क्योंकि मैं वेक्टर रैपर के जीवनकाल को मानचित्र के लिंक से जोड़ना चाहता हूं। मैं बहुत कम चिंतित अनुप्रयोग में
shared_ptr
के व्यापक उपयोग के संभावित ओवरहेड के बारे में थोड़ा चिंतित हूं (शायद अनावश्यक रूप से?)।
- मैं इस समाधान पर कम उत्सुक हूं क्योंकि मैं वेक्टर रैपर के जीवनकाल को मानचित्र के लिंक से जोड़ना चाहता हूं। मैं बहुत कम चिंतित अनुप्रयोग में
क्या आपके सार बेस क्लास में वर्चुअल विनाशक है? – TemplateRex
हां यह करता है। .. –