b.b*_*old 6 c++ pointers auto-ptr
我遇到了几个问题,其答案表明使用T*绝不是最好的主意.
虽然我已经大量使用RIIC,但我的代码中有一个特殊点,我使用T*.阅读几个自动指针,我找不到一个我会说我有使用它的明显优势.
我的情景:
class MyClass
{
...
// This map is huge and only used by MyClass and
// and several objects that are only used by MyClass as well.
HashMap<string, Id> _hugeIdMap;
...
void doSomething()
{
MyMapper mapper;
// Here is what I pass. The reason I can't pass a const-ref is
// that the mapper may possibly assign new IDs for keys not yet in the map.
mapper.setIdMap(&_hugeIdMap);
mapper.map(...);
}
}
Run Code Online (Sandbox Code Playgroud)
MyMapper现在有一个HashMap<...>*成员,根据对无关问题的问题的高度投票答案 - 从来不是一个好主意(在实例之前,映射器将超出范围MyClass,因此我不认为这是一个太大的问题.有没有new映射器中没有delete将需要).
那么这个特定用例中最好的选择是什么?
我个人认为原始指针(或引用)在这里没问题.智能指针涉及管理指向的对象的生命周期,并且在这种情况下MyMapper不管理该对象的生命周期MyClass.您也不应该有一个指向未动态分配的对象的智能指针(在这种情况下哈希映射不是这样).
就个人而言,我会使用以下内容:
class MyMapper
{
public:
MyMapper(HashMap<string, Id> &map)
: _map(map)
{
}
private:
HashMap<string, Id> &_map
};
Run Code Online (Sandbox Code Playgroud)
请注意,这将阻止MyMapper具有赋值运算符,并且只有在构造函数中传递HashMap可接受时它才能工作; 如果这是一个问题,我会使该成员成为一个指针(虽然我仍然将该参数作为参考传递,并_map(&map)在初始化列表中执行).
如果MyMapper使用哈希映射的其他类或其他任何类都可以使用MyClass,那么你必须开始考虑智能指针.在那种情况下,我可能会建议std::shared_ptr,但你必须在任何地方使用它:_hugeIdMap必须是shared_ptr动态分配的值,而不是常规的非指针字段.
更新:
既然你说由于项目的编码标准,使用引用是不可接受的,我建议只是坚持使用原始指针,原因如上所述.
| 归档时间: |
|
| 查看次数: |
230 次 |
| 最近记录: |