我在函数外返回字符串时遇到问题。之前有没有应该做的转换?
我在课外使用公共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将其转换为