在我的公司里,我偶然发现了以下两个代码片段,我一见钟情就感到非常不愉快,但本着向编写这段代码的工程师提供建设性反馈的精神,我正在试图找出为什么这段代码不好的技术论据:
FileTableEntry * FilerManager::GetFileTableEntry(uint32_t i) const {
return &(GetFileTable()[i]);
}
…
for (uint32_t i = 0; i < container_.size(); ++i) {
*GetFileTableEntry(i) = FileTableEntry();
// GetFileTableEntry ultimately accesses a std::vector in FileManager
}我的主要论点是:
还有其他关于不写这样的代码的理由吗?
发布于 2015-07-07 22:31:04
反对此代码的另一个参数是,在对象始终存在的情况下,GetFileTableEntry的签名返回一个指针。这需要引用,而不是指针:
FileTableEntry& FilerManager::GetFileTableEntry(uint32_t i) const {
return GetFileTable()[i];
}这应该是你的第一点。您的第二点可以通过创建引用const来解决
const FileTableEntry& FilerManager::GetFileTableEntry(uint32_t i) const {
return GetFileTable()[i];
}这禁止调用方修改GetFileTableEntry返回的内部状态。
注意:为了使GetFileTableEntry函数有用,应该对传入的索引添加一个边界检查,以便尽早捕获错误。
https://stackoverflow.com/questions/31280373
复制相似问题