gpt4 book ai didi

c++ - 使用哪种(自动)指针?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:22:34 25 4
gpt4 key购买 nike

我遇到了几个问题,其中的答案表明使用 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(...);
}
}

MyMapper现在有一个 HashMap<...>*成员,根据对不相关问题的高度投票回答,这从来都不是一个好主意(虽然映射器将在 MyClass 的实例之前超出范围,因此我不认为这是一个太大的问题。映射器中没有 new,因此不需要 delete

那么在这个特定用例中最好的选择是什么?

最佳答案

我个人认为这里可以使用原始指针(或引用)。智能指针关注管理所指向对象的生命周期,在这种情况下 MyMapper 不管理该对象的生命周期,MyClass 是。你也不应该有一个智能指针指向一个不是动态分配的对象(在这种情况下 HashMap 不是)。

就我个人而言,我会使用如下内容:

class MyMapper
{
public:
MyMapper(HashMap<string, Id> &map)
: _map(map)
{
}
private:
HashMap<string, Id> &_map
};

请注意,这将阻止 MyMapper 具有赋值运算符,并且只有在构造函数中传递 HashMap 是可接受的情况下它才能工作;如果这是一个问题,我会让成员成为一个指针(尽管我仍然将参数作为引用传递,并在初始化列表中执行 _map(&map))。

如果 MyMapper 或任何其他使用散列映射的类有可能比 MyClass 活得更久,那么您就必须开始考虑智能指针了。在那种情况下,我可能会推荐 std::shared_ptr,但你必须在所有地方使用它:_hugeIdMap 必须是 shared_ptr > 动态分配的值,而不是常规的非指针字段。


更新:

既然你说由于项目的编码标准,使用引用是 Not Acceptable ,出于上述原因,我建议只坚持使用原始指针。

关于c++ - 使用哪种(自动)指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6761774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com