我正在开展一个QT项目并发现了一个奇怪的行为:
我有一个类,其中有几个构造函数看起来像
DB_Variable(QString name, QString newValue):
name(name),value_string(newValue), var_type(DB_STRING){}
DB_Variable(QString name, bool newValue):
name(name), value_bool(newValue), var_type(DB_BOOL){}
我现在想要使用第一个构造函数来创建这样的对象:
DB_Variable foo("some_name"," ");
我希望将空字符串解释为QString,但调用第二个(bool)构造函数。有人可以告诉我为什么吗?是" "一个指向空字符串的指针然后某种方式而不是一个bool而不是一个字符串?
Foo
答案 0 :(得分:6)
此问题是由构造函数中的隐式转换引起的。 String literals(例如代码中的{}}存储为const char
类型。因为您没有采用此类型的构造函数,所以编译器会尝试查找转换为可在其中一个构造函数中找到的类型。
在这种情况下,const char*
比bool
更容易转换为QString
所以当你这样做时:
DB_Variable foo("some_name"," ");
构造函数
DB_Variable(QString name, bool newValue):
被召唤。
请注意,由于" "
的处理方式不同于任何其他字符串文字,因此您所看到的行为并不是因为您很可能没有使用构造函数类型bool, bool
(所有构造函数都将QString
作为第一个参数?)。如果您有一个如下构造函数,则可能是这样的:
DB_Variable(bool test1, bool newValue):
当您执行DB_Variable foo("some_name"," ");
要获得您想要的结果,您可以传递QStrings
,如此:
DB_Variable foo(QString("some_name"), QString());
或者可能定义一个构造函数,它将const char*
作为第二个参数。
答案 1 :(得分:1)
字符串" "
只是char*
。与使用用户定义的转换为bool
相比,它更容易转换为QString
。
答案 2 :(得分:1)
我希望将空字符串解释为QString,但调用第二个(bool)构造函数。有人可以告诉我为什么吗?
" "
从char[2]
衰减到char*
,然后作为指针转换为int,作为int,它会转换为bool。
我对Qt不是很熟悉,但如果QString
的构造函数(带有char [N]或char *参数)是显式的,那么在编写时只会使用第一个构造函数:< / p>
DB_Variable foo("some_name", QString{ " " });
// HERE: ^^^^^^^^ ^
最简单的解决方案是在DB_Variable类中添加第三个构造函数。您可以通过多种方式执行此操作,但如果您希望将空值设置为" "
(默认情况下),则应编写与此类似的代码:
DB_Variable(QString name):
name(name),value_string(" "), var_type(DB_STRING){}
客户代码:
DB_Variable foo("some_name"); // create variable with empty value (actually " " value)