Getter函数,当找不到对象时不会崩溃

时间:2013-02-24 01:21:44

标签: c++

我有一个包含成员变量的类,该变量是自定义对象的列表。我正在尝试编写一个getter函数,该函数查看此列表,试图找到一个具有提供名称的函数。我希望通过常量引用返回所述对象(如果找到),或者只输出“具有名称的对象”名称“未找到”。否则,不会崩溃我的程序。有任何想法吗?我想我可以创建另一个函数,如果存在匹配的对象,只返回一个布尔值,并先调用它。如果返回true,则获取给定项。然而,这是低效的,我想做得更好。

3 个答案:

答案 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版本,我对新语言功能不是很熟悉,这似乎不太清晰。