将函数添加到字符串类

时间:2011-08-04 18:43:56

标签: c++ string class-design

我理解从std :: string类继承是一个糟糕的想法,但只是尝试使用继承将自定义函数添加到字符串类以进行虚拟赋值。 我想将我的功能称为“添加'当我做str.add(str1,str2);它应该在字符串的开头附加str1,在字符串的末尾附加str2。这个类(继承的字符串类)是另一个类的私有成员类(比如Parent)。当我尝试使用它来访问我的字符串类对象时,它指向Parent类。我怎么能这样做?

由于

3 个答案:

答案 0 :(得分:3)

我不确定我理解你问题的所有方面。当你说一个私有成员类时,你的意思是私有成员变量?还是私下继承?我不明白“当我尝试使用它来访问我的字符串类对象时,它指向父类”。

你是对的,继承自std :: string可能不是一个好主意。首先,使它成为派生字符串的成员需要您对底层实现了解很多;这可能会从分发变为分发,使代码不可移植。如果您使用std :: string提供的已定义接口编写可移植的实现,则无论如何都无法利用任何真正的优化。除非你有充分的理由,否则最好不要这样做。

其次,名称“添加”可能不是最好的,因为它似乎没有描述你在做什么。 “环绕”可能是一个更好的名字。

我认为像这样的外部函数可能会更好,避免从字符串继承的整个想法:

void surround(std::string &orig, std::string const &pre, std::string const &post) {
    orig = pre + orig + post;
}

或者,如果您想要更高的性能,请执行以下操作:

void surround(std::string &orig, std::string const &pre, std::string const &post) {
    std::string str;
    str.reserve(orig.size() + pre.size() + post.size());
    str.insert(str.end(), pre.begin(), pre.end());
    str.insert(str.end(), orig.begin(), orig.end());
    str.insert(str.end(), post.begin(), post.end());
    std::swap(str, orig);
}

答案 1 :(得分:2)

不要继承std::string,这真是一个坏主意。您必须编写适当的构造函数,并且永远不要将它与多态性一起使用,因为std::string没有虚拟析构函数。只需编写一个免费功能。

答案 2 :(得分:0)

请务必在课堂的公共部分声明您的功能。

也许你会喜欢构图而不是继承;)

    class MyString
    {
           std::string m_string; // do not inherit just composition it
    public:
            explicit MyString(const std::string& str)
                   : m_string(str)
            {
            }

            // your function should be in public scope I think
            MyString& add(const std::string& begin, const std::string& end)
            {
                    m_string.insert(0, begin);
                    m_string.append(end);
                    return *this;
            }

            const std::string& string() const
            {
                    return m_string;
            }
    };

    class Parent
    {
            MyString m_string;
    public:
            void surround(const std::string& begin, const std::string& end)
            {
                    m_string.add(begin, end);
            }
    };

    int main(int argc, char *argv[])
    {
            std::cout << MyString("inherit").add("Do not ", " from std::string!").string() << std::endl;
            return 0;
    }