0

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

4

3 回答 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 回答