44

我正在自学 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>] 

它基本上是在抱怨 line: mValue=0;

为什么抱怨这条线?我不能为字符串分配空值?

4

8 回答 8

78

我不能为字符串分配空值?

No. std::string不是指针类型;它不能设为“null”。它不能表示没有值,这是用空指针表示的。

可以通过为它分配一个空字符串(s = ""s = std::string()或清除它(s.clear())来使其为空。

于 2012-07-23T17:39:35.387 回答
18

您不能将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);
}

希望这可以帮助!

于 2012-07-23T17:41:12.183 回答
7

文字0是类型int,您不能分配intstd::string. 使用mValue.clear()或分配一个空字符串mValue=""

于 2012-07-23T17:39:08.290 回答
5

我不会争辩说这是一个主意(或与不是指针nullptr的事物一起使用的语义),但创建一个提供“可为”语义的类相对简单(参见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 兼容性,请参阅有关 Boost.Optional 的答案

于 2016-10-27T08:33:51.460 回答
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只分配给when 不是mValuevalue指针。在所有其他情况下(即何时空),将包含一个空字符串。value mValue

在缺少 from 的值的情况下,三元运算符方法可能有助于提供替代的默认字符串文字value

std::string mValue = value ? value : "(NULL)";
于 2013-02-07T12:30:04.003 回答
0

这种else情况是不必要的,当您创建一个string对象时,默认情况下它是空的。

于 2012-07-23T17:41:37.107 回答
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 调用本身之前保持一切。

于 2017-04-06T15:48:48.370 回答
0

编译器给出错误,因为在分配 mValue=0 时编译器找到赋值运算符 =(int ) 用于编译时绑定,但它不存在于字符串类中。如果我们像 mValue=(char)0 这样将以下语句键入到 char 中,那么它的编译成功,因为 string 类包含 operator=(char) 方法。

于 2018-12-14T19:18:19.580 回答