我有一个名为Mystring的派生类,它派生自std :: string,我想设置我正在使用的字符串的值。
根据我的理解,从std :: string访问字符串对象,我会使用* this来获取我当前使用的字符串。
我想将* 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;
}
答案 0 :(得分:3)
除了样式之外,使用赋值运算符“重置”继承的子对象的基本思想不一定是错误的。
但是,需要进行转换才能从std::string
(RHS的类型)转换为Mystring
(LHS的类型,即*this
)。执行该转换的唯一方法是使用构造函数Mystring(std::string)
。除了......你已经在里面了。因此,该函数是有效的递归函数,并将永远重复,直到您耗尽堆栈。
您需要将*this
转发给std::string
才能使其发挥作用:
static_cast<std::string&>(*this) = n;
我同意这里的其他人你不应该从std::string
派生,当然不仅仅是添加一些应该是std::string
的自由函数的实用函数(也许但是在一个漂亮的命名空间中?)。
答案 1 :(得分:0)
不要这样做。在这种情况下,派生没有任何好处。
创建添加的函数作为对字符串进行操作的自由函数。例如:
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);
}
使这两者中的任何一个都成为一个成员函数是没有用的,也没有任何好处。