C++ 带有链表的重载 += 运算符

C++ Overloaded += operators with a linked list

本文关键字:运算符 重载 链表 C++      更新时间:2023-10-16

所以我正在做一个家庭作业,在使用动态字符数组编写了我们自己的 std::string 类版本以及一些基本函数之后,我们应该将其转换为链表。一切都很正常(尽管可能没有尽可能高效(,但我遇到了一个障碍。最低的 += 重载函数,您只需在字符串对象的末尾添加一个字符,当我测试它时似乎工作正常。第二个,您将向字符串对象添加字符数组,则没有。尝试使用它会导致运行时错误。由于最高的 += 重载函数依赖于第二个函数,因此这也不起作用。

我认为问题与线路有关:

headPtr += addend[index];

但是如果这确实是问题所在,我不确定用什么来代替headPtr。代码如下:

页眉:

#ifndef STRING2_H
#define STRING2_H
#include <cstring>
namespace string2
{
class string
{
private:
    struct stringList
    {
        char character;
        stringList* link;
    };
    stringList* headPtr;
public:
    // CONSTRUCTORS AND DESTRUCTOR
    string() { headPtr = NULL; };
    string(const stringList* sourcePtr);
    ~string();
    // CONSTANT MEMBER FUNCTIONS
    char getChar(const size_t position) const;
    size_t length() const;
    char operator [ ] (size_t position) const;
    // MODIFICATION MEMBER FUNCTIONS
    void operator += (const string& addend);
    void operator += (const char addend[]);
    void operator += (char addend);
};
}
#endif

相关。CPP 函数定义:

void string::operator += (const string& addend)
{
    for (int i = 0; i < addend.length(); i++)
        headPtr += addend[i];
}
void string::operator += (const char addend[])
{
    if (addend[0] == NULL)
        return;
    for (int index = 0; index < (sizeof(addend) / sizeof(addend[0])); index++)
        headPtr += addend[index];
}
void string::operator += (char addend)
{
    stringList *indexPtr = headPtr;
    if (headPtr == NULL)
    {
        headPtr = new stringList;
        headPtr->character = addend;
        headPtr->link = NULL;
        return;
    }
    while (indexPtr->link != NULL)
        indexPtr = indexPtr->link;
    indexPtr->link = new stringList;
    indexPtr->link->character = addend;
    indexPtr->link->link = NULL;
}

感谢帮助!

你说得对。问题headPtr += addend[index];,但不是因为运算符过载,而是因为内存冲突。这将增加 headPtr 指针的字节数和 addend[index] 的 ASCII 值,因此下次您将调用"运算符 +=(char addend("时,它会将内存写入"空间不足"的地方。

我可以看到两个问题:

  1. 您可以简化对"addend"变量的迭代(请参阅下面的示例(。
  2. 您正在尝试将"char"添加到指针头Ptr。我认为您希望做的是与operator +=(char a)完全相同。那么为什么不叫它呢?

如果将"+=(const char[]("更改为此形式,这应该会有所帮助:

void string::operator += (const char v[])
{
    for (int i = 0; v[i] != ''; i++) {
        (*this) += v[i]; // call to: void string::operator += (char addend)
    }
}

你甚至可以变成这样的黑客形式:

for (; *v != ''; v++)  (*this) += *v; 

或者这个:

for (; *v != ''; (*this) += *v, v++);

但我不推荐它。这太棘手了,你可以像任何练习一样使用它来理解C++的C部分。

我认为您对void string::operator += (const string& addend)也有同样的问题.