我如何确保在有多个候选函数的情况下调用正确的函数
How can I ensure that correct function is called in case there are multiple candidates
在c++中是完全合法的:
bool x = "hi";
因为"hi"被编译器翻译成一个char数组,并返回一个指向该数组的指针,该指针是一个数字,而数字可以隐式地转换为bool
(0为假,其他为真)。
所以我有这些:
Exception(QString Text, bool __IsRecoverable = true);
Exception(QString Text, QString _Source, bool __IsRecoverable = true);
遗憾的是我发现打电话
Exception *e = new Exception("error happened", "main.cpp @test");
它创建了一个使用Exception(QString Text, bool __IsRecoverable = true);
构造函数创建的"Exception"类的新实例,这是错误的。
是否有一种简单的方法来确保正确的函数被调用,而不是完全重构构造函数,改变参数的位置,等等?
首先,我不确定为什么要动态分配一个异常类。我不确定这是个好主意。
你可以显式地构造一个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
版本。还要注意,以下划线和大写字母开头或以两个下划线开头的名称是保留的。
我的建议是不要使用默认参数。它们导致了像这样的重载解析问题,无论如何,仅仅将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抛出,那么事情很快就会走下坡路。但是你可以选择不担心这种可能性,因为如果系统内存耗尽,而你的异常处理没有为这种可能性做好准备,那么无论如何它都会终止。
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 在不传递参数数量且只有3个点的情况下,如何使用变差函数
- 在这种情况下,java对象是否可以调用本机函数
- 这个c++代码是如何在没有定义函数的情况下运行的
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- 如何在没有函数的情况下编写此代码并使C++更简单?
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- A类的定义需要B类的定义,如何在不公开B的定义的情况下公开A的公共函数?
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 有没有办法在不使用 #ifdef 的情况下不编译发布版本中的单元测试函数体?
- C++ strcpy 函数在少数主要情况下失败
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 是否可以在不填充自己的参数的情况下将模板函数作为参数传递?
- 如何在没有复制构造函数的情况下为地图设置值?
- 在这种情况下,如何传递成员函数而不是函数?
- 构造函数/解构函数情况下的'undefined reference to vtable for'
- 我如何确保在有多个候选函数的情况下调用正确的函数
- c#和c++中虚函数情况下编译器行为的差异.这是我在一次采访中被问到的问题