0

我正在制作自己的字符串类,除了一个之外,一切都运行良好:我正在尝试重载operator +=运算符,以便我可以做到这一点:

string s1 = "Hello", s2 = " World";

s1 += s2;

所以这就是我尝试的:

// In the string class,

string& operator +=(string const& other)
{
    using std::strcpy;

    unsigned length = size() + other.size() + 1; // this->size() member
    char *temp = new char[length];               // function and a "+ 1" for the
                                                 // null byte '\0'
    strcpy(temp, buffer);
    strcpy(temp, other.data());

    delete[] buffer;

    buffer = new char[length];
    strcpy(buffer, temp);     // copy temp into buffer

    return *this;
}

但是在我的程序中,当使用上面显示的 main 中的代码时,打印后没有输出。我也没有收到任何错误(甚至没有运行时错误)。为什么会这样,我该如何解决这个实现?

注意:我知道我可以使用std::string,但我想自己学习如何做到这一点。

4

2 回答 2

3

这里有个问题:

strcpy(temp, other.data());

您已经将第一个字符串复制到缓冲区中(在上一行中),但这会用另一个字符串的数据覆盖它。您希望使用以下命令将其他字符串的数据附加strcat到缓冲区:

strcat(temp, other.data());

正如 Jerry 指出的那样,您的另一个问题是您一开始就没有正确初始化您的字符串。

顺便说一句,如果您要使用strcpy,strcat等,您应该真正使用长度限制版本 ( strncpy, strncat) 以避免潜在的缓冲区溢出问题。

于 2013-06-12T00:39:21.007 回答
3

只需快速浏览一下您在Mac 的答案的评论中发布的演示。这是你的问题:

string(char const *str) : buffer(new char[strlen(str)]), len(strlen(str))
{}

// ...

string s1 = "Hello";

您在构造函数中分配缓冲区,但从不将数据复制到其中。如果你这样做会发生什么std::cout << s1;


编辑:顺便说一句,我注意到至少另外两个问题:

  • 你没有len更新operator +=
  • 您的复制构造函数使两个strings 指向同一个缓冲区。这很糟糕,当一个人尝试使用它时,它会在另一个人使用它时爆炸delete[]
于 2013-06-12T00:48:58.767 回答