重载运算符+。字符串类

时间:2012-10-12 12:56:22

标签: c++ operator-overloading overloading

我自己写字符串类。而且我重载了+运算符。它的工作正常,但后来我尝试了cstr = str +pop,它没有做任何事情。 `你可以在main()函数中看到我的错误。 Complier不会给出任何错误。

#include <iostream>
#include <string.h>
#include <stdlib.h>

using namespace std;

class S {

public:
          S();
          S(const char *str);
          S(const S &s);

         ~S() { delete []string;}
          S  &operator  =(const S   &s);

          int  lenght() const {return l     ;}
      char*  strS() const {return string;}

      friend ostream &operator <<(ostream &, const S &first) {cout<<first.string;}
      friend S    operator+ (const S& first, const S& second);

private:
          char *string;
          int l;

};

int main(){
S pop("Q6");
S str("M5");

S cstr = str +pop; // works correct
cout<<str;

str = str + pop;
cout<<str ;        // doesnt work, it doesnt write in terminal

return 0;
}
S::S()
{
    l = 0;
    string = new char[1];
    string[0]='\0';
}

S::S(const char *str)
{
    l      = strlen(str);
    string = new   char[l+1];
    memcpy(string, str, l+1);
}

S::S(const S &s)
{
     l = s.l;
     string = new char[l+1];
     memcpy(string,s.string,l+1);
}

S &S::operator=(const S &s)
{
    if (this != &s)
    {
        delete []string;
        string = new char[s.l+1];
        memcpy(string,s.string,s.l+1);
        return *this;
    }
    return *this;
}

S    operator +(const S& first, const S& second)

{
    S temp;
    temp.string = strcat(first.strS(),second.strS());
    temp.l      = first.lenght() + second.lenght();

  return temp;
 }

我期待着你的帮助。

5 个答案:

答案 0 :(得分:3)

您的运营商有错误!

S temp;
//^^^^ has only one byte buffer!!!
temp.string = strcat(first.strS(),second.strS());
//   1 byte   ^^^^^ strcat appends second.strS to first.strS

你应该为temp重新分配内存:

S temp;
temp.l      = first.lenght() + second.lenght();
delete [] temp.string; // !!!! - 
temp.string = new char[temp.l + 1]; // !!!!
// you should have another c-tor which can allocate memory!!!
// like: S(unsigned length, unsigned char c = '\0') 
strcpy(temp.string, first.strS());
strcat(temp.string, second.strS());

除了这个明显的错误之外 - 你还应该处理异常 - 例如std::bad_alloc。查看复制和交换习惯用法,以便更好地完成此任务。

答案 1 :(得分:2)

来自the manpage for strcat

 The strcat() and strncat() functions append a copy of the null-terminated
 string s2 to the end of the null-terminated string s1, then add a termi-
 nating `\0'.  The string s1 must have sufficient space to hold the
 result.

你正在使用它,好像它为一个新的char数组分配空间,然后填充它。但是,它没有这样做。

答案 2 :(得分:1)

问题是你的operator+没有为组合字符串分配任何内存。它也不会将字符串复制到正确的位置(它将字符串复制到第一个,而不是复制到临时)。你的课程设计没有简单的解决方法。

答案 3 :(得分:0)

问题出在operator+的实施上。 strcat()将第二个参数派生的字符串追加到第一个参数指向的字符串。返回值是第一个参数。因此,从operator+返回时,生成的S和第一个S参数将指向同一个缓冲区。以后会删除两次......

答案 4 :(得分:0)

检查strcat的说明。它将第二个参数附加到 第一个,假设两个都是空终止字符串,并返回 第一个论点。在你的情况下:

  • 它首先附加到string成员,但没有 enoguh记忆(未定义的行为)和

  • 它将string中的temp指针设置为指向相同的内存 在first;第一个被破坏的是另一个 指向已删除的内存,以及默认分配的内存 temp的构造函数被泄露了。

此外,您永远不会使用'\0'终止字符串,因此strcat可能会这样做 几乎任何事情。

更好的解决方案是首先实施+=,然后定义+ 条款。 +=必须增加它拥有的内存,然后追加 从第二个字符串到它的文本。

虽然我在做它:你的operator=也不起作用。它会 如果new将对象置于无法破坏的状态 失败(抛出std::bad_alloc)。您必须确保所有操作 在<{em> delete之前发生失败。 (你需要的事实 测试自我分配是一个警告标志。对此非常罕见 在正确编写的赋值运算符中进行必要的测试 在这种情况下,交换习语可能是你最好的选择:复制 在局部变量中构造一个新的S,然后交换它们的成员。