【发布时间】:2015-12-29 01:45:34
【问题描述】:
我正在用 C++ 实现一个双键(整数和字符串)查找表,我想知道我应该如何为它编写一个析构函数。
查找表 API 允许用户将命名对象插入和查找到表中。在幕后,一个唯一的 int 键会自动分配给包含对象名称的字符串。插入后可以通过字符串名称或int值查找插入的对象。
这里是实现的要点。
template <class VALUE>
class COLLECTION
{
public;
typedef int IDX;
typedef std::map< std::string , IDX > NAME_TO_IDX;
typedef std::map< IDX, std::string > IDX_TO_NAME;
typedef std::map<IDX, VALUE*> IDX_TO_VAL;
...
void insert( const std::string name, VALUE* v )
{
m_name_to_idx_map[name] = m_next_idx;
m_idx_to_name_map[m_next_idx] = name;
m_idx_to_val_map[m_next_idx] = v;
++m_next_idx;
}
VALUE* get_value( const IDX idx ) { return m_idx_to_val_map[idx]; }
VALUE* get_value( const std::string name )
....
private:
int m_next_idx;
NAME_TO_IDX m_name_to_idx_map;
IDX_TO_NAME m_idx_to_name_map;
IDX_TO_VAL m_idx_to_val_map;
如何为这个类编写析构函数? 谢谢
【问题讨论】:
-
绝对:
void insert(const std::string& key, std::unique_ptr<VALUE> value),宾果游戏。如果你讨厌在代码中表达需求,你也可以传递一个原始指针并在函数声明上方添加一个注释// Takes owernship of *value and calls "delete" on the pointer.。 (重要的是要明确,用户不得传递从malloc或数组-new获得的指针,因此仅“获取所有权”不够精确。但唯一的指针不会引起歧义。) -
对于
m_idx_to_name_map和m_idx_to_val_map,最好(平均而言)使用vectors 而不是maps,因为索引是连续的(假设您不支持删除)。 -
为什么你会有这种看似毫无意义的间接性和你的类的混合责任也是值得怀疑的。为什么不只是有一个
map<int, VALUE>?如果用户关心间接,她可以使用VALUE = std::unqiue_ptr<X>。 -
您也可以考虑使用
boost::bimap进行此类双向映射。 -
Kerrek 的职责分离建议是迄今为止最好的选择,
unique_ptr是第二个,但 FWIW 另一个是有一个模板策略参数或构造函数参数指定一个可以调用的函子取消分配(如有必要)VALUE*。另外,最好为预处理器宏保留全大写标识符,但可用于模板参数的单字母标识符除外。
标签: c++ string memory-management