如果有多个候选者,我如何确保调用正确的函数

时间:2014-06-21 13:03:14

标签: c++

在C ++中完全合法:

bool x = "hi";

因为"嗨"由编译器转换为char数组并返回一个指向该数组的指针,该数组是一个数字,数字可以隐式转换为bool(0为false,其他任何都为真)。

所以我有这些ctor:

Exception(QString Text, bool __IsRecoverable = true);
Exception(QString Text, QString _Source, bool __IsRecoverable = true);

可悲的是,我发现了打电话

Exception *e = new Exception("error happened", "main.cpp @test");

它创建了一个新的" Exception"使用Exception(QString Text, bool __IsRecoverable = true);构造函数创建的类,这对于某个点是错误的。

是否有一种简单的方法可以确保调用正确的函数,而不是完全重构构造函数,更改参数的位置等?

2 个答案:

答案 0 :(得分:6)

首先,我不确定您为何动态分配异常类。我不确定这是不是一个好主意。

您可以明确构建QString

Exception e("error happened", QString("main.cpp @test"));

或者你可以传递第三个参数:

Exception e("error happened", "main.cpp @test", true);

或者您可以添加一个额外的构造函数,该构造函数需要const char*,并且优先于转换为bool

Exception(QString Text, const char* Source, bool IsRecoverable = true);

您可以轻松地将其转发到QString版本。另请注意,保留以下划线,大写字母或下划线开头的名称。

答案 1 :(得分:1)

我的建议是不使用默认参数。它们会导致像这样的重载解决问题,并且无论如何只看true作为参数都不是非常易读。无论谁在阅读代码,都必须停下来查看true的含义。即使是你自己,你可能会在几个月后忘记它,当你回到代码时,特别是如果你做了很多这样的事情。

例如:

struct Exception: public whatever
{
    Exception(char const *text);
    Exception(char const *text, char const *source);
};

struct RecoverableException: public Exception
{
    RecoverableException(char const *text);
    RecoverableException(char const *text, char const *source);
};

在这个源文件中输入更多一点但是回报是实际使用异常的代码更简单,更清晰。

要实现这些构造函数,您可以让它们在.cpp文件中调用特定函数,并使用相关参数选择所需的行为。

我倾向于使用char const *而不是QString,因为我对两件事情有点偏执:

  • 不受欢迎的转化
  • 内存分配失败

如果构建一个QString抛出,那么事情就会快速下降。但是你可以选择不担心这种可能性,因为如果系统内存不足并且你的异常处理没有为这种可能性做准备,那么它将以任何一种方式终止。