【问题标题】:Adding functions to std::string in c++在 C++ 中向 std::string 添加函数
【发布时间】:2020-06-18 13:28:51
【问题描述】:

我只是错过了c++标准库字符串类中的一些函数,所以我只想自己添加这些。我是这样写的:

#include <string>


class String : public std::string
{
public:
    // some new fancy functions
};

后来通过阅读一些论坛注意到,从标准库中继承 std::string 和任何其他容器是一个坏主意。

我只想要普通的字符串,但是我自己编写的附加功能,我怎样才能以正确的方式实现呢?还是没有办法做对,我必须纠正我自己的字符串类?

【问题讨论】:

  • 这是最正确的做法,但通常是个坏主意。如果您想要新功能,最好编写与std::string 一起使用的功能。如果它们是通用的并且也可以与其他容器一起使用,则可以加分。

标签: c++ string class inheritance c++-standard-library


【解决方案1】:

首先 - std::string 有点乱,并且有太多的方法。将功能集中到一个不需要在该类中的类中是糟糕的设计,并且可以使用更简单、更基本的类方法轻松实现 - 作为一个独立的函数。

此外 - std::string 同时难以操作(它不是字符串缓冲区或 std::stringstream),并且并非不可能操作,即不是不可变的。

但回到我之前的观点:“正确的方式”——如果有的话——做你想做的事是使用独立的函数。例如,假设您想随机排列 std::string 的内容。好吧,要么:

std::string& jumble(std::string& str)

std::string jumble(std::string str)

或者,如果你想感觉很酷和微优化,

std::string jumble(const std::string& str)
std::string jumble(std::string&& str)

取决于您是否想将字符串更多地用作不可变实体或可变实体。

还请记住,我们实际上并没有一个 std::string 类 - 我们有一个基于字符类型(和分配器等)的模板,所以如果你想要通用,你必须接受这个类:

template<
    class CharT,
    class Traits = std::char_traits<CharT>,
    class Allocator = std::allocator<CharT>
> class basic_string;

PS - 如果我们有统一的调用语法,例如 Bjarne proposed - 恕我直言,我们真的应该这样做 - 你的独立函数可以简单地被调用,就好像它们是成员一样:

auto jumbled = my_string.jumble();

【讨论】:

  • 哦,请不要统一调用语法。 C/C++ 的优势之一是,它们用它们的专有名称来称呼不同的事物,并且不会试图将复杂性隐藏在自动魔法门面后面。嗯,实际上,C 比 C++ 更重要。统一调用语法只是将已经无可救药的过度功能的 C++ 转换为类似 javascript 的另一个步骤,乍一看可能看起来很漂亮,但实际上很难推断出一个语句的实际作用。当然,C++ 一直朝着这个方向发展,auto 是最严重的违规者,但每进一步的步骤都是有害的恕我直言。
  • “统一调用语法”实际上会让事情变得更加明确和类似 C。它将反映(非静态)方法的固有现实,它只是一个接受“this”指针的函数,可以访问私有成员,并且有一些语法糖来避免一直说“this->”。很明显,如果你写x.bar(y),你的意思是bar(&amp;x, y)——就像a-&gt;z(*a).z一样。
猜你喜欢
  • 1970-01-01
  • 2017-03-18
  • 2022-01-03
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 2020-11-04
  • 2019-06-04
  • 1970-01-01
相关资源
最近更新 更多