我自己学习C ++。我有以下代码,但它给出了错误。
#include <iostream>
#include <string>
using namespace std;
int setvalue(const char * value)
{
string mValue;
if(value!=0)
{
mValue=value;
}
else
{
mValue=0;
}
}
int main ()
{
const char* value = 0;
setvalue(value);
cin.get();
return 0;
}
所以想创建一个接受char指针的函数,我想传递一个指向它的指针。该函数将指针指定给其成员变量。我故意传递一个空指针。以下是我得到的错误:
D:\CPP\TestCP.cpp In function `int setvalue(const char*)':
note C:\Dev-Cpp\include\c++\3.4.2\bits\basic_string.h:422 candidates are: std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]
note C:\Dev-Cpp\include\c++\3.4.2\bits\basic_string.h:422 std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const _CharT*) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]
note C:\Dev-Cpp\include\c++\3.4.2\bits\basic_string.h:422 std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(_CharT) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]
它主要是抱怨行:mValue = 0;
为什么抱怨这条线?我不能将null赋给String?
答案 0 :(得分:59)
我不能将null赋给String?
没有。 std::string
不是指针类型;它不能成为“null”。它不能表示缺少值,这是一个空指针用来表示的。
可以通过为其分配空字符串(s = ""
或s = std::string()
)或清除它(s.clear()
)来使为空。
答案 1 :(得分:15)
您无法将NULL
或0
分配给C ++ std::string
对象,因为该对象不是指针。这是与C风格字符串的一个关键区别; C风格的字符串可以是NULL
或有效的字符串,而C ++ std::string
总是存储一些值。
没有简单的解决方法。如果您想保留一个标记值(比如空字符串),那么您可以执行类似
的操作const std::string NOT_A_STRING = "";
mValue = NOT_A_STRING;
或者,您可以存储指向字符串的指针,以便将其设置为null:
std::string* mValue = NULL;
if (value) {
mValue = new std::string(value);
}
希望这有帮助!
答案 2 :(得分:5)
文字0
的类型为int
,您无法将int
分配给std::string
。使用mValue.clear()
或指定一个空字符串mValue=""
。
答案 3 :(得分:4)
有两种方法可以考虑哪种方法可以实现处理C指针字符串的空指针的相同效果。
三元运算符
void setvalue(const char *value)
{
std::string mValue = value ? value : "";
}
或简陋的if语句
void setvalue(const char *value)
{
std::string mValue;
if(value) mValue = value;
}
在这两种情况下,value
仅在mValue
空指针时才会分配给value
。在所有其他情况下(即当value
为空时),mValue
将包含空字符串。
三元运算符方法可用于在没有value
的值的情况下提供备用默认字符串文字:
std::string mValue = value ? value : "(NULL)";
答案 4 :(得分:2)
我不认为它是好的想法(或使用nullptr
使用不是指针的东西的语义),但创建一个提供&#34; nullable&#34;的课程相对简单。语义(见nullable_string)。
然而,这更适合C ++ 17 std::optional:
#include <string>
#include <iostream>
#include <optional>
// optional can be used as the return type of a factory that may fail
std::optional<std::string> create(bool b)
{
if (b)
return "Godzilla";
else
return {};
}
int main()
{
std::cout << "create(false) returned "
<< create(false).value_or("empty") << std::endl;
// optional-returning factory functions are usable as conditions of while and if
if (auto str = create(true))
{
std::cout << "create(true) returned " << *str << std::endl;
}
}
std::optional
,如示例中所示,可以转换为bool
,或者您可以使用has_value()
方法,具有异常访问权限等等。这为您提供了可空的语义,这似乎是Maria试图完成的事情。
如果您不想等待C ++ 17兼容性,see this answer about Boost.Optional。
答案 5 :(得分:0)
else
案例是不必要的,当您创建string
对象时,它默认为空。
答案 6 :(得分:0)
许多C API使用空指针来指示“使用默认值”,例如mosquittopp。以下是我使用的模式,基于David Cormack的答案:
mosqpp::tls_set(
MqttOptions->CAFile.length() > 0 ? MqttOptions->CAFile.c_str() : NULL,
MqttOptions->CAPath.length() > 0 ? MqttOptions->CAPath.c_str() : NULL,
MqttOptions->CertFile.length() > 0 ? MqttOptions->CertFile.c_str() : NULL,
MqttOptions->KeyFile.length() > 0 ? MqttOptions->KeyFile.c_str() : NULL
);
这有点麻烦,但允许用户将所有内容保持为std::string
直到API调用本身。
答案 7 :(得分:0)
compiler给出了错误,因为在分配mValue = 0时,编译器会在编译时绑定中找到赋值操作符=(int),但它不存在于字符串类中。 如果我们像mValue =(char)0一样将以下语句强制转换为char类型,则其编译成功,因为字符串类包含operator =(char)方法。