无法将"std::string {aka std::basic_string<char>}"转换为"char"作为回报



我在函数外返回字符串时遇到问题。之前有没有应该做的转换?

我在课外使用公共const int val_int[ ]const char* val_rom[ ]

内部类:

private:
char* roman;
public:
char arab2rzym(int arabic) throw (RzymArabException){
if( arabic < 0){
throw RzymArabException(arabic + " is too small");
}
else if(arabic > 3999){
throw new RzymArabException(arabic + " is too big");
}
std::string roman;
for(int i=12; i>=0; i--){
while(arabic>=val_int[i]){
roman.append(val_int[i]);
arabic-=val_int[i];
}
}
return roman;
}

是否可以将方法的签名更改为:

std::string arab2rzym(int arabic)

如果是这样,您可以在实际需要的地方使用字符串。

无论如何,我建议您研究std::string引用,尤其是运算符[]和方法c_str()

从逻辑上讲,字符类似于'a''1',而字符串应该是"a11a"。如果你希望它能起作用,你希望它做什么?"a11a"对应的字符是什么?那么,一个字符对应一个字符数组?

为了回答这个问题,您会得到错误,因为您无法将字符串转换为字符。如何修复它完全取决于你想要完成什么——很可能你不想返回char,而是返回string

我认为应该将方法的签名更改为:

std::string arab2rzym(int arabic)

此外,您在方法中使用std::string定义隐藏私有char*roman类变量,我不知道这是否是目的?

顺便说一句,在c++中,声明一个方法抛出哪些异常通常不是一个好主意,因为如果您稍后修改代码以抛出不同的异常,而忘记更新"throws"声明,那么它就会调用默认的意外异常处理程序来终止程序。一种约定是在方法定义的末尾编写throws声明,但随后将其注释掉。这样,使用你的方法的人就知道它抛出了什么,但如果你忘记用声明更新定义,你的程序就不会崩溃。

如果您坚持返回char,有两种解决方案可以实现

首先,声明一个私有的std::string变量,并通过c_str 返回它

private :
std::string roman;
char const* arab2rzym(int arabic){
if( arabic < 0){                
throw RzymArabException(std::to_string(arabic) + " is too small");
}
else if(arabic > 3999){
throw new RzymArabException(std::to_string(arabic) + " is too big");
}        
roman.clear();
for(int i=12; i>=0; i--){
while(arabic>=val_int[i]){
roman.append(val_int[i]);
arabic-=val_int[i];
}
}
return roman.c_str();
}

其次,将roman声明为静态变量

char const* arab2rzym(int arabic){
if( arabic < 0){
throw RzymArabException(std::to_string(arabic) + " is too small");
}
else if(arabic > 3999){
throw new RzymArabException(std::to_string(arabic) + " is too big");
}
static std::string roman;
roman.clear();
for(int i=12; i>=0; i--){
while(arabic>=val_int[i]){
roman.append(val_int[i]);
arabic-=val_int[i];
}
}
return roman.c_str();
}

最后要提的是,我不认为RzymArabException(阿拉伯语+"太大了");可以做你想做的事,你应该在做之前把阿拉伯语转换成字符串

如果您的编译器支持c++11

RzymArabException(std::to_string(arabic) + " is too big");

如果不是

RzymArabException((char)(((int)'0')+arabic) + std::string("is too big"));

更好地使用interpret_cast将其转换为

最新更新