2

我正在编写一些像这样的 C++ 代码:

//c++ code
class MovieInfo;

MovieInfo getMovieInfoByName(String movieName)
{
    //search the movieInfoList with movieName
    if(FOUND)
        return movieInfo;
    //TODO: **what should i return if the movieInfo can't be found in the list?**
} 

问题是如果在列表中找不到movieInfo,我应该返回什么?

4

2 回答 2

5

你有几个选择:

  • 定义MovieInfo类以使“无效”实例成为可能(类似于默认构造的std::thread不代表实际线程的方式)并返回这样的实例。

  • 使其getMovieInfoByName()名称对应于有效的电影信息的前提条件,如果不对应,则简单地返回一个随机值(因为“违反前提条件会导致未定义的行为”)。

  • 找不到名称时抛出异常。

  • 返回类似boost::optional<MovieInfo>.

  • 提供getMovieInfoByName()一个额外的类型参数,MovieInfo如果找不到名称匹配,该参数将用作返回值。

这完全取决于您对该功能的预期用途。

于 2013-10-11T10:26:16.640 回答
1

这取决于必须满足的上下文和先决条件。例如,如果您在调用列表时不确定列表中是否包含这样的电影,那么这样做是合理的:

bool getMovieInfoByName(const std::string& movieName, MovieInfo& movieInfo)
{
    ...
    if (FOUND) {
        movieInfo = ...;
        return true;
    }
    return false;
}

因为调用者很可能必须知道带有此类电影的电影是否存在。

如果不应该发生getMovieInfoByName找不到电影的情况,即调用者应该已经通过其他方式知道列表是否包含这样的电影,那么抛出异常是完全合理的,因为它是异常状态,而是指示错误用法这种方法。

还有一种称为Null Object的设计模式,它基于构造一个对象,其状态可以指示它是有效/初始化的对象还是表示 NULL 的虚拟实例。
在这种情况下,调用者很可能仍然需要检查是否MovieInfo返回了适当的实例,并且此类应提供诸如bool isValid();.

于 2013-10-11T10:30:46.703 回答