我有一个包含成员变量的类,该变量是自定义对象的列表。我正在尝试编写一个getter函数,该函数查看此列表,试图找到一个具有提供名称的函数。我希望通过常量引用返回所述对象(如果找到),或者只输出“具有名称的对象”名称“未找到”。否则,不会崩溃我的程序。有任何想法吗?我想我可以创建另一个函数,如果存在匹配的对象,只返回一个布尔值,并先调用它。如果返回true,则获取给定项。然而,这是低效的,我想做得更好。
答案 0 :(得分:2)
选项:
未找到时抛出异常 - 在调用者中捕获
返回迭代器 - 检查== .end()
以确定是否在调用者中找不到(STL执行此操作)
让函数返回指针并返回NULL
如果找不到
有一个特殊的对象表示找不到,并在找不到时返回对它的引用
预先检查是否存在(如您所述)
答案 1 :(得分:0)
你有分离存在检查和价值回溯的想法是合理的。
它本身并不低效,无论如何,为什么不尝试一下,看看它是否成为瓶颈?如果第一个impelmentation似乎效率低下,只需缓存一个提示或者可能是检查的整个结果
否则你的选项包括在找不到时抛出异常,并使用Baron / Nackman Fallible
类的一些实现作为函数结果,例如boost::optional
(或只是滚动你自己的)
而且,考虑一下,你可以只返回一个指针。对于指针或数组对象类型来说这可能很尴尬,但通常应该是最干净的解决方案。返回nullpointer以指示“找不到对象”。
答案 2 :(得分: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版本,我对新语言功能不是很熟悉,这似乎不太清晰。