0

我是 C++ 的初学者,所以答案可能很明显。

我有两个函数 - 一个能够将 int 转换为字符串,另一个能够将 double 转换为字符串。然而,将这两者合二为一会更优雅。我已经用下面的代码试过了,但它会产生一个错误:'number' is not declared in this scope

string number_into_string (void* data, int psize)
{
    if (psize == sizeof(int))
    {
        int* number; number =(int*)data;
    }
    if (psize == sizeof(double))
    {
        double* number; number = (double*)data;
    }
    ostringstream convert;
    convert << number;
    string str = convert.str();
    return str;
}

int main()
{
    double x =1000;
    int y = 5;
    string str_x = number_into_string(&x, sizeof(x));
    string str_y = number_into_string(&y, sizeof(y));
}
4

4 回答 4

9

由于numberif ... {括号内声明,它只存在于该空间中。此外,在 C 或 C++ 中,一个变量不能有两种不同的类型。

(如果您有 C++11 编译器,则根本不需要这样做,只需使用std::to_stringwhich exists 对于大多数标准类型即可)。

解决方案是不使用指针,而是使用模板函数:

template<typename T> string number_into_string(T number)
{
    ostringstream convert;
    convert << number; 
    string str = convert.str();
    return str;
}
于 2013-07-31T14:06:16.457 回答
3

很简单,使用std::to_string函数。

于 2013-07-31T14:05:29.440 回答
0

一对花括号{}创建一个嵌套范围,在该范围内创建的对象在外部范围中不可见。您可以将代码重新排列为如下所示:

string number_into_string (void* data, int psize)
{
    ostringstream convert;
    if (psize == sizeof(int))
    {
        convert << *((int*) data);
    }
    if (psize == sizeof(double))
    {
        convert << *((double*) data);
    }
    return convert.str();
}

就个人而言,我会使用标准库函数而不是(糟糕地)重新发明轮子。

于 2013-07-31T14:09:27.007 回答
0

除了非常混乱之外,错误的主要原因是变量范围。每个变量都有其可见范围,超出该范围是不可见的。

在功能number_into_string中,您有 3 个作用域:

  1. 功能范围 - 这是整个功能number_into_string
  2. if一块
  3. 第二if

来自函数范围的变量在两个if块中都是可见的,但反之则不可见。

这意味着,在您的代码中:

convert << number;

您正在使用当前范围内未知(可见)的变量。

另一件事是,如果不使用模板或将该“转换代码”的两个副本放入每个 if 块中,您就不能在 C++ 中执行此“通用值的事情”,这会使具有单个“转换功能”的点无效。

此外,您无法可靠地区分doubleint使用sizeof.

于 2013-07-31T14:11:44.487 回答