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

时间:2016-02-16 11:57:01

标签: c++ string class operator-overloading

我想要一个类似下面的课程:

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

我希望能够使用以下声明:

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

我该怎么办?我应该覆盖to_string吗?如果是,似乎无法从std :: string类继承。 或者我必须覆盖特殊运算符? 指针分配怎么样?如下所示:

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

2 个答案:

答案 0 :(得分:7)

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

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

这样可以将Test对象隐式转换为std::string

答案 1 :(得分:2)

虽然在C ++中有可能,但通常不建议继承标准类,有关详细信息,请参阅Why should one not derive from c++ std string class?

我想知道,

的分配功能是什么
str = t;

str是std :: string类型,t是Test类型。那么该分配的预期价值是多少?没有人能猜到。我建议明确调用转换方法或运算符以获得代码清晰度。

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

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++

虽然这是您问题的完美解决方案,但从长远来看,可能会出现无法预料的问题,详见链接文章。