从派生类构造函数

时间:2018-03-06 20:46:20

标签: c++ class stdstring

我有一个名为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;
}

2 个答案:

答案 0 :(得分:3)

除了样式之外,使用赋值运算符“重置”继承的子对象的基本思想不一定是错误的。

但是,需要进行转换才能从std::string(RHS的类型)转换为Mystring(LHS的类型,即*this)。执行该转换的唯一方法是使用构造函数Mystring(std::string)。除了......你已经在里面了。因此,该函数是有效的递归函数,并将永远重复,直到您耗尽堆栈。

Stack filling up

您需要将*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);
}

使这两者中的任何一个都成为一个成员函数是没有用的,也没有任何好处。

参考