gpt4 book ai didi

c++ - 在 C++ 中,一个类如何在构造函数中采用 const std::string& 参数,同时还能处理 NULL?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:54:41 26 4
gpt4 key购买 nike

我正在尝试通过多种方式创建一个带有 std::string 参数的类,但它也可以处理 NULL 而不会抛出异常。下面是代码示例:

class myString {
public:
myString(const std::string& str) : _str(str) {}
std::string _str;
};

int main() {
myString mystr(NULL);
printf("mystr = <%s>\n", mystr._str.c_str());
return 0;
}

直觉上,您会认为该程序应该打印“mystr = <>”并成功退出,但是使用 g++ 时它会给出以下错误:

terminate called after throwing an instance of 'std::logic_error'  
what(): basic_string::_S_construct NULL not valid

我如何更改此类,使其将 NULL 转换为 ""而不是抛出 logic_error 异常?

(后记:正如您所怀疑的那样,“真正的”实现比这个例子要复杂一些,在构造函数中有几个参数并用 _str 做更多有趣的事情——并适本地保持它的私有(private)性。背后的动机这个例子是我们团队中的程序员出于历史目的倾向于在此上下文中使用 NULL,而编译器不会捕捉到这一点。重新训练每个人总是使用“”是相对困难的。或者,一个聪明的解决方案很容易)

最佳答案

这里实际发生的是 NULL 被解释为 char const* 并试图转换为 std::string (您可以将 char* 类型的 C 字符串转换为 STL 字符串,对吗?)。

要处理它,您可以添加另一个构造函数

class myString {
public:
myString(const std::string& str) : _str(str) {}
myString(const char* str) : _str(str==NULL?"":std::string(str))
{ /* and do something special in the body */ }
std::string _str;
};

但是如果你在那里不需要什么特别的东西,更好的方法是

class myString {
public:
myString(const std::string& str = "") : _str(str) {}
std::string _str;
};
int main() {
myString mystr; //no () here!
printf("mystr = <%s>\n", mystr._str.c_str());
return 0;
}

关于c++ - 在 C++ 中,一个类如何在构造函数中采用 const std::string& 参数,同时还能处理 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1603251/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com