继承自 std::string 或运算符重载

inherit from std::string or operator overloading

我想要 class 如下所示:

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

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

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

我该怎么办?我应该覆盖 to_string 吗?如果是,似乎无法从 std::string class 继承。 或者我必须覆盖特殊操作员? 指针赋值呢?如下所示:

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

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

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

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

虽然在 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++

虽然这是对您问题的完美解决方案,但它可能会在很长一段时间内带来无法预料的问题 运行,如链接文章中所述。