我遇到了返回字符串外部函数的问题。是否应该在之前进行某种转换?
我在课堂外使用公开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;
}
答案 0 :(得分:2)
逻辑上,char类似于'a'
或'1'
,而字符串则为"a11a"
。如果您希望这样做,您期望它做什么?与"a11a"
对应的字符是什么?那么,一个字符对应一个字符数组?
要回答这个问题 - 您会收到错误,因为您无法将字符串转换为字符。你如何解决它完全取决于你想要完成的事情 - 很可能你不想返回char
,而是string
。
答案 1 :(得分:2)
您是否可以将方法的签名更改为:
std::string arab2rzym(int arabic)
如果是这样,您可以使用实际需要它的字符串。
无论如何,我建议你研究std::string reference,尤其是operator[]和方法c_str()
。
答案 2 :(得分:1)
我认为您应该将方法的签名更改为:
std::string arab2rzym(int arabic)
此外,您正在使用方法中的std :: string定义隐藏私有char * roman类变量,我不知道这是否意图?
顺便说一下,声明一个方法抛出的异常在c ++中通常不是一个好主意,好像你以后修改代码抛出一个不同的异常,忘记更新“throws”声明然后它调用默认的意外异常处理程序,终止程序。一种惯例是在方法定义的末尾编写throws声明,然后将其注释掉。这样人们使用你的方法知道它抛出了什么,但如果你忘记用声明更新定义,你的程序就不会失败。
答案 3 :(得分:0)
如果你坚持使用return 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"));
最好使用reinterpret_cast来施展它