我创建了一个小类,并尝试将其用作STL hash_map
中的数据。很多搜索让我知道我需要添加东西作为分配器,但到目前为止,我没有看到如何在我的类中使用STL中的默认分配器的示例。有人可以帮忙并告诉我吗?我在下面放了一个缩小版的课程。
class cwVariable {
public:
cwVariable();
template <typename T>
cwVariable(T value)
{
stash = new byte[sizeof(T)];
memcpy(stash, &value, sizeof(T));
}
template <typename T>
void set(T value)
{
if (stash != 0) {
memcpy(stash, &value, sizeof(T));
}
}
template <typename T>
T get()
{
T out;
memcpy(&out, stash, sizeof(T));
return out;
}
~cwVariable();
private:
void * stash = 0;
};
cwVariable::~cwVariable() {
delete stash;
}
为了完整性:我正在使用Arduino 1.6.4工具链,来自Arduino端口的STL并且目标是Arduino Mega 2560.使用Visual Studio 2012的Visual Micro插件。
稍后添加: 我的真实代码处理的不仅仅是上面的,而只是C类型的字符串指针,而不是String。当我添加
时,这条路径就开始了std::hash_map<const char*, cwVariable> months;
到我的代码并获得输出
cwVar.cpp.o:In function `std::hash_map<char const*, cwVariable, std::hash<char const*>,
std::equal_to<char const*>, std::allocator<cwVariable> >::operator[](char const* const&)'
stl_hash_map.h:cwVariable()'
collect2.exe*:error: ld returned 1 exit status as the error.
这让我的研究更多,让我担心分配器。
答案 0 :(得分:2)
您不需要分配器。这些是您在进行自己的内存管理时(例如,内存池)。你需要什么,以及你的班级没有什么,是一个有效的深层复制构造函数。你的班级有免费的浅拷贝构造函数。这将复制指针而不是指针的内容。
按原样,您的类不包含必须知道如何复制构造实例的信息。解决此问题的一种方法是将分配的类型的大小存储为数据成员。复制构造函数将为新存储的新存储分配一个正确大小的stash
和memcpy
源存储。
更好的方法是使整个类成为一个类模板,这是在您的设计存在潜在问题之后。您对void*
和memcpy
的使用是未来问题的一个方法。因此,您的班级适用于POD classes,但不是其他。
如果您对整个班级进行模板化并将void* stash
更改为T stash
,那么免费赠品复制构造函数就是您想要的。如果您将void* stash
更改为T* stash
,则必须提供复制构造函数,但这很简单。在这两种情况下,您的get和set成员函数都很简单,而且您的代码比当前void* stash
/ memcpy
实现更通用。
答案 1 :(得分:0)
简单地将您的类用作hash_map中的数据类型不需要您拥有分配器。如果要为地图实施特定的分配策略,则只需要分配器。