2

我在函数外返回字符串时遇到问题。之前是否应该进行某种转换?

我正在使用公共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;

    }
4

4 回答 4

2

从逻辑上讲,char 类似于'a'or '1',而字符串则为"a11a". 如果您希望它起作用,您希望它做什么?对应的字符"a11a"是什么?那么,一个字符对应一个字符数组呢?

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

于 2013-03-31T20:38:36.017 回答
2

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

std::string arab2rzym(int arabic)

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

无论如何,我建议您查看std::string reference,尤其是operator[]和 method c_str()

于 2013-03-31T20:48:42.903 回答
1

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

std::string arab2rzym(int arabic)

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

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

于 2013-03-31T20:47:21.113 回答
0

如果您坚持返回字符,有两种解决方案可以做到这一点

首先,声明一个私有的 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(arabic + " is too big"); 可以做你想做的事,你应该在做之前将阿拉伯语转换为字符串

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

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

如果不

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

更好地使用 reinterpret_cast 来转换它

于 2013-03-31T20:59:26.000 回答