【问题标题】:inherit from std::string or operator overloading从 std::string 或运算符重载继承
【发布时间】:2016-02-16 11:57:01
【问题描述】:

我想要一个像下面这样的课程:

Class Test {
  Test();
  ~Test();
  ...
}

我希望能够使用以下语句:

std::string str;
Test t;
str = t;

我该怎么办?我应该覆盖 to_string 吗?如果是,似乎不可能从 std::string 类继承。 或者我必须覆盖特殊运算符? 指针赋值呢?如下:

std::string str;
Test* t = new Test();
str = t;

【问题讨论】:

    标签: c++ string class operator-overloading


    【解决方案1】:

    您可以为std::string提供用户定义的转换运算符:

    class Test {
      //...
    public:
      operator std::string () const {
        return /*something*/;
      }
    };
    

    这将允许将Test 对象隐式转换为std::string

    【讨论】:

    • Test::operator std::string() const 只是我的 2c
    • 如果我想把Test类的指针赋值给std::string怎么办?
    • 我建议你不要这样做。或者这样做:std::string tmp = my_test; doSomething(&tmp);
    • 我需要。我没有得到你最后的评论答案。我有一个测试类的指针,我需要将它分配给一个字符串。
    【解决方案2】:

    虽然在 C++ 中是可能的,但通常不建议从标准类继承,请参阅Why should one not derive from c++ std string class? 了解更多信息。

    我想知道,赋值的作用是什么

    str = t;
    

    str 是 std::string 类型,t 是测试类型。那么分配的期望值是多少?没有人能猜到。为了代码清晰,我建议显式调用转换方法或运算符。

    这将使您的示例看起来像:

    str = t.convertToString();
    

    或者更标准的方式是实现流操作符,这使得

    str << t;
    

    (请注意,如果 str 是流类型,则此示例有效,如果是字符串,则需要进一步的代码,请参阅C++ equivalent of java.toString?。)

    但是,如果你真的想让它在没有转换方法的情况下工作,你可以重写Test的字符串赋值运算符:

    class Test {
    public:
        operator std::string() const { return "Hi"; }
    }
    

    另见toString override in C++

    虽然这是您问题的完美解决方案,但从长远来看,它可能会带来无法预料的问题,如链接文章中所述。

    【讨论】:

    • 您可以在 C++11 中明确转换运算符,因此您必须编写 str = static_cast&lt;std::string&gt;(t); 这可能更安全,即使它是更多字符。
    • 请注意,某些标准类是用于继承的,例如标准异常类。但大多数不是。
    猜你喜欢
    • 2011-12-05
    • 1970-01-01
    • 2012-01-23
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多