我有一个名为Mystring的派生类,它派生自std :: string,我想设置我正在使用的字符串的值。
根据我的理解从std :: string访问字符串对象,我将使用* this来获取我当前使用的字符串。
我想将*这个设置为我选择的字符串,我做了我的设置* this = n;但它崩溃我的代码并返回“线程1:EXC_BAD_ACCESS(代码= 2,地址= 0x7ffeef3ffff8)”我的代码如下:
所以我的问题是,如何通过派生类将std :: string的值设置为某个值。非常感谢!
class Mystring : public std::string
{
public:
Mystring(std::string n);
std::string removePunctuation();
std::string toLower();
};
Mystring::Mystring(std::string n)
{
*this = n;
}
std::string Mystring::removePunctuation()
{
long int L = length();
char *cstr = new char[L + 1];
strcpy(cstr, c_str());
//cout << cstr[L-1] << endl; // last character of c string
if(!isalpha(cstr[L-1]))
{
pop_back() ;
}
return *this;
}
std::string Mystring::toLower()
{
long int L = length();
char *cstr = new char[L + 1];
strcpy(cstr, c_str());
for(int i = 0; i < L;i++)
{
int buffer = cstr[i];
cstr[i] = tolower(buffer);
std::cout << cstr[i];
}
std::string returnstring(cstr);
delete [] cstr;
return returnstring;
}
int main() {
Mystring temp("dog");
std::cout << "Hello World";
return 0;
}
除了风格之外,使用赋值运算符“重置”继承的子对象的基本思想不一定是不正确的。
但是,需要转换从std::string
(RHS的类型)到Mystring
(LHS的类型,即*this
)。执行该转换的唯一方法是使用构造函数Mystring(std::string)
。除了......你已经在里面了。因此,该函数是有效的递归函数,并将永远重复,直到您耗尽堆栈。
你需要将*this
升级到std::string
才能完成这项工作:
static_cast<std::string&>(*this) = n;
我同意这里的其他人你不应该从std::string
派生,当然不仅仅是添加一些应该是自由函数的实用函数来获取std::string
(虽然可能在一个很好的命名空间中?)。
不要这样做。在这种情况下,派生没有任何好处。
创建添加的函数作为对字符串进行操作的自由函数。例如:
void remove_punctuation(std::string &s) {
if (!std::isalpha(s.back()))
s.pop_back();
}
void tolower(std::string &s) {
for (auto &c : s)
c = std::tolower(c);
}
使这两者中的任何一个成为一个成员函数没有任何意义,也没有任何好处。