在C 中参考返回的参数中积累事物是一种气味吗?
Is it a smell to accumulate things in a parameter returned by reference in C++?
我有以下映射类:
class ObjectMapper {
public:
std::map<uint32_t, uint32_t>& getMappingForObject(
Object* object);
private:
std::unordered_map<Object*, std::map<uint32_t, uint32_t>> m_objMapping;
};
其实现就是这样:
std::map<uint32_t, uint32_t>& ObjectMapper::getMappingForObject(
Object* object) {
const auto mappingTableIterator = m_objMapping.find(object);
if (mappingTableIterator == m_objMapping.end()) {
auto it = m_objMapping.emplace(object,
std::map<uint32_t, uint32_t>());
return it.first->second;
}
return mappingTableIterator->second;
}
因此,呼叫者可以这样做:
std::map<uint32_t, uint32_t>& mappingTable =
objMapper.getMappingForObject(object);
继续并添加/删除mappingTable
中的内容。
这是C 的好模式吗?我觉得这是使用参考输出参数通过所有权,这是一种气味,但我不确定。还有更好的选择吗?
以简单的术语重写您的功能,只要呼叫者不存储结果以供以后使用并知道更改地图将使参考无效。让我们回到这个...
您的原始功能可以被重写为:
std::map<uint32_t, uint32_t>& ObjectMapper::getMappingForObject(Object* object)
{
if (m_objMapping.count(object) == 0)
{
// a new object, remove test if nothing special needs to be done.
}
return m_objMapping[object];
}
作为一般规则,您应该假设对象贴图对象将超过呼叫者的范围。返回的参考来自我们自己的对象数据,因此,只要呼叫者遵循规则,就不应该存在终生问题。
。如果您打算使用返回的地图长时间(超过几毫秒:) 或在多线程应用程序中地图相反,为了最大程度地减少数据结构在锁定的时间,并"对"地图数据的任何更改进行"交易"。
相关文章:
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- 有没有一种方法可以从函数中返回一个新对象或对现有对象的引用
- 当一种方法有三种返回可能性时该怎么办?
- 返回对私有向量成员元素的非常量引用是否是一种不好的做法
- 从 r 值引用限定方法返回 r 值引用是否是一种好的做法?
- 是否可以将一种函数类型转换为另一种采用相同参数但返回类型不同的函数类型
- 一种创建将字符串常量返回给枚举的类的廉价方法,反之亦然
- 在C 中参考返回的参数中积累事物是一种气味吗?
- C++:访问由另一种方法返回的向量的常量向量时出现分段错误
- 返回一个原始指针而不是unique_ptr是一种良好的编码实践吗
- 是否有一种方法可以通过C 中的OUT参数接收Python中的返回值
- 有没有一种方法可以让函数返回类型名
- 元组作为一种返回类型,是经过优化的未处理值
- 以这种方式返回对新创建的对象的引用,这是一种安全的做法
- 有没有一种方法可以将C++数据类型作为变量返回
- C++ 一种方法,该方法将十进制值作为用布尔数组表示的二进制的整数返回
- 当您将引用返回到局部变量时,它是否是一种未定义的行为
- 返回类成员是一种不好的做法吗?
- 将函数返回的共享指针绑定到常量的左值引用是否是一种好的做法
- 在bison中,是否有一种方法可以返回令牌的Name而不是其类型