代码之家  ›  专栏  ›  技术社区  ›  Gary Willoughby

C++中是否存在C?

  •  4
  • Gary Willoughby  · 技术社区  · 16 年前

    我现在正在学习C++,我遇到了一个简单的问题:把int转换成字符串。我使用了:

    string IntToString(int Number)
    {
        stringstream Stream;
        Stream << Number;
        return Stream.str();
    }
    

    不过,如果用这样的方法会更优雅:

    int x = 5;
    string y = x.toString();
    

    但我该如何添加 toString()

    还是我错过了一些基本的东西?

    6 回复  |  直到 16 年前
        1
  •  -1
  •   Adrian Regan    16 年前

    我不会从基本的\u string/string派生任何类。不建议这样做,而且字符串中的任何方法都不是虚拟的,它没有虚拟析构函数(因此派生可能导致内存泄漏)

    为自己打造美丽:

    您可以创建一个静态类(只包含静态方法的类),以便将所有类都放在一个地方。对int、float、double等使用方法重载。

    class Converter {
       private:
           Converter() {}
    
       public:
         static string toString(int i) {
            ... your implementation ...
         }
    
         static string toString(float f) {
            ... same but floats.
         }
         .... other overloads ....
    };
    
    ... somewhere else in your code ....
    
    string c = Converter::toString(5);
    
        2
  •  7
  •   anon anon    16 年前

    不,你不能扩展这样的类——在C++中,最好的方法是写免费函数,就像你正在做的一样。这些通常可以是有益的模板:

    template <typename T>
    string ToString(const T & t)
    {
        stringstream Stream;
        Stream << t;
        return Stream.str();
    }
    

    实际上是什么 lexical_cast 做。

        3
  •  4
  •   Nikko    16 年前

    内置类型或像int这样的普通旧数据没有方法。流的概念是你可以从任何东西中转换任何东西,而不仅仅是豆荚。

    int i = 12;
    std::string s = boost::lexical_cast< std::string >( i );
    

    它可以在boost库中找到。

    您可以根据IntToString方法自己编写这个方法的基本版本,但模板化可以用于任何类型。

    template<typename To, typename From >
    To my_own_cast(const From & f)
    {
        std::stringstream stream;
        stream << f;
    
        To t;
        stream >> t;
        return t;
    }
    

    用法如下:

    std::string s;
    s = my_own_cast< std::string >( 12 );
    
    int i= my_own_cast< int >( s );
    

    通常,据我所知,在上一个版本中,词法转换可能比仅仅使用流要复杂一些,并且在可能的情况下尽量提高效率。已经讨论过了,我不确定是否实施了。

        4
  •  2
  •   Péter Török    16 年前

    作为替代,你可以超载 operator << :

    string& operator<<(string& str, int Number)
    {
        stringstream Stream;
        Stream << Number;
        str = Stream.str();
        return str;
    }
    
    int x = 5;
    string y;
    y << x;
    
        5
  •  2
  •   AshleysBrain    16 年前

    扩展方法不受C++语言的支持。理想的解决方法是一个单独的函数,就像您已经用演示的那样 IntToString .

    std::string 并使用自己的成员函数“扩展”它—但是从标准容器类派生是非常困难的 . 您也可以编写自己的字符串类,但为什么要重新发明轮子呢?你的 into字符串

        6
  •  0
  •   Dimitri C.    16 年前

    它们不受支持,但唯一的缺点是稍微缺乏符号的一致性。你必须写:

    SomeClass someInstance;
    ToString(someInstance);
    

    而不是:

    someInstance.ToString();