lar*_*ker 5 c++ string inheritance class std
我只是错过了c++标准库字符串类中的一些函数,所以我只想自己添加这些函数。我写了这个:
#include <string>
class String : public std::string
{
public:
// some new fancy functions
};
Run Code Online (Sandbox Code Playgroud)
后来通过阅读一些论坛注意到,从标准库中的 std::string 和任何其他容器继承是一个坏主意。
我只想要普通的字符串,但是有了我自己编写的附加函数,我怎样才能以正确的方式实现这一点?或者没有办法正确地做到这一点,我必须正确我自己的字符串类?
首先 -std::string有点混乱,并且有太多方法。将不需要在该类中的功能集中到一个类中是糟糕的设计,并且可以使用更简单、更基本的类方法轻松实现 - 作为独立函数。
此外 -std::string同时难以操作(它不是字符串缓冲区或 )std::stringstream,并且并非不可能操作,即不是不可变的。
但回到我之前的观点:“正确的方法”——如果有的话——做你想做的事情是使用独立的函数。例如,假设您想要随机排列std::string. 好吧,要么:
std::string& jumble(std::string& str)
Run Code Online (Sandbox Code Playgroud)
或者
std::string jumble(std::string str)
Run Code Online (Sandbox Code Playgroud)
或者也许,如果你想要感觉很酷并且进行微观优化,
std::string jumble(const std::string& str)
std::string jumble(std::string&& str)
Run Code Online (Sandbox Code Playgroud)
取决于您是否想将字符串更多地用作不可变实体或可变实体。
还要记住,我们实际上没有一个std::string类 - 我们有一个基于字符类型的模板(和分配器等),所以如果你想通用,你必须接受这个类:
template<
class CharT,
class Traits = std::char_traits<CharT>,
class Allocator = std::allocator<CharT>
> class basic_string;
Run Code Online (Sandbox Code Playgroud)
PS - 如果我们有统一的调用语法,就像Bjarne 提出的那样 - 恕我直言,我们确实应该这样做 - 您的独立函数可以简单地被调用,就好像它们是成员一样:
auto jumbled = my_string.jumble();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1537 次 |
| 最近记录: |