从派生类构造函数设置std :: string数据成员

问题描述 投票:0回答:2

我有一个名为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;
}
c++ class stdstring
2个回答
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(虽然可能在一个很好的命名空间中?)。


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);
}

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

References

© www.soinside.com 2019 - 2024. All rights reserved.