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