我有一个包含一个成员变量的类,它是一个自定义对象的列表。我正在尝试编写一个 getter 函数,它通过这个列表查找一个具有提供名称的列表。如果找到,我想通过常量引用返回所述对象,或者只输出“找不到名称为“名称”的对象。” 否则,不会使我的程序崩溃。有任何想法吗?我想我可以制作另一个函数,如果存在匹配的对象,则只返回一个布尔值,然后首先调用它。如果它返回 true,则获取给定的项目。但是,这是低效的,我想做得更好。
问问题
104 次
3 回答
2
选项:
找不到时抛出异常 - 在调用者中捕获它
返回一个迭代器 - 检查
== .end()
以确定是否在调用者中找不到(STL 这样做)让函数返回一个指针,
NULL
如果找不到则返回有一个特殊对象指示未找到,并在未找到时返回对该对象的引用
事先检查是否存在(如您所述)
于 2013-02-24T01:26:25.757 回答
0
您可以提供 2 个版本的访问器,一个抛出异常,或者静默返回空对象,另一个具有要报告的参数,该数据不存在:
class Props {
public:
const Object &get( const std::string &name ) const; // throws exception or silently retruns empty
const Object &get( const std::string &name, bool &found ) const; // returns flag
};
在 C++11 中它可能更干净:
class Props {
public:
const Object &get( const std::string &name, bool &&found = bool() ) const;
};
我会把它带回 C++11 版本,我对新的语言特性不是很熟悉,这似乎不太干净。
于 2013-02-24T01:31:12.697 回答
0
您将存在检查和价值检索分开的想法是合理的。
它本身并不是低效的,无论如何,为什么不尝试一下,看看它是否成为瓶颈?如果第一次执行似乎效率低下,只需缓存一个提示或检查的整个结果
否则,您的选择包括在找不到时抛出异常,并使用 Baron/NackmanFallible
类的某些实现作为函数结果,例如boost::optional
(或只是滚动您自己的)
而且,考虑一下,您可以只返回一个指针。这对于指针或数组对象类型可能很尴尬,但通常应该是最干净的解决方案。返回一个空指针来表示“找不到对象”。
于 2013-02-24T01:26:39.563 回答