Tôi có một lớp cơ sở trừu tượng (ví dụ: VectorWrapperBase) làm giá trị và điều này cho phép tôi ánh xạ chuỗi thành các loại vectơ khác nhau.Đối tượng ánh xạ có chứa ptr_map của lớp cơ sở trừu tượng
boost::ptr_map<std::string, VectorWrapperBase> memory_map;
//...
memory_map.insert(str_key, new VectorWrapper<T>());
Điều này có vẻ hiệu quả. Tuy nhiên, khi tôi có memory_map
là thành viên của một lớp khác và cố gắng lưu trữ lớp đó trong một std::map
, việc biên dịch không thành công.
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()));
Dòng cuối cùng không thành công với:
/SOMEPATH/boost_1_48_0/boost/ptr_container/clone_allocator.hpp:34
error: cannot allocate an object of abstract type ‘xyz::VectorWrapperBase’
Là mới đến C++, đây là khó hiểu.
I nghi ngờ lỗi xảy ra với việc sao chép bản đồ đối tượng AgentMemory
liên quan đến nhân bản ptr_map
. Và kể từ khi đối tượng VectorWrapper
của tôi không phải là cloneable, lỗi được nâng lên.
Câu hỏi của tôi là:
- Tại sao tôi nhận lỗi? (Có phải sự nghi ngờ của tôi thậm chí gần với những gì đang xảy ra không?)
- Làm cách nào để giải quyết vấn đề này?
Để giải quyết những lỗi biên dịch, tôi đã xem xét những điều sau đây, nhưng không có nhiều kinh nghiệm với C++ không thể quyết định là thích hợp hơn:
- Tháo specifier tinh khiết (
= 0
) đểVectorWrapperBase
là không còn trừu tượng- này cảm thấy giống như một hack từ
VectorWrapperBase
không bao giờ nên được instantiated
- này cảm thấy giống như một hack từ
- Tận dụng tối VectorWrappers cloneable
- This seems to work, nhưng trong trường hợp sử dụng của tôi chỉ các vùng chứa trống được gán cho bản đồ cấp cao nhất để VectorWrappers bên trong
ptr_map
bên trong không bao giờ được nhân bản. Các cloneability do đó sẽ có chỉ để xoa dịu trình biên dịch và không phản ánh việc sử dụng thực tế.
- This seems to work, nhưng trong trường hợp sử dụng của tôi chỉ các vùng chứa trống được gán cho bản đồ cấp cao nhất để VectorWrappers bên trong
- Quên
ptr_map
và sử dụngstd::map
vàshared_ptr
thay thế.- Tôi ít quan tâm đến giải pháp này vì tôi muốn tuổi thọ của trình bao bọc véc tơ được liên kết với bản đồ của bản đồ. Tôi cũng quan tâm một chút (có lẽ không cần thiết như vậy?) Về chi phí tiềm năng của việc sử dụng rộng rãi
shared_ptr
trong một ứng dụng nhiều luồng.
- Tôi ít quan tâm đến giải pháp này vì tôi muốn tuổi thọ của trình bao bọc véc tơ được liên kết với bản đồ của bản đồ. Tôi cũng quan tâm một chút (có lẽ không cần thiết như vậy?) Về chi phí tiềm năng của việc sử dụng rộng rãi
Lớp Tóm tắt Cơ sở của bạn có trình phá hủy ảo không? – TemplateRex
Có. .. –