C ++重载+ =具有链表

时间:2018-03-25 07:26:46

标签: c++

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

我认为问题与这条线有关:

headPtr += addend[index];

但是我不确定用什么代替headPtr,如果这实际上是问题。这是代码:

HEADER:

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

非常感谢帮助!

1 个答案:

答案 0 :(得分:0)

你是对的。问题是headPtr += addend[index];,但也不是因为运算符过载,而是因为内存违规。这会将headPtr指针增加为addend [index]的ASCII值的多个字节,因此下次您将调用&#39;运算符+ =(char addend)&#39;它将把记忆写在某个地方&#34;空间&#34;。

我可以看到两个问题:

  1. 您可以简化&#39;加数&#39;的迭代。变量(见下面的样本)。
  2. 您正试图添加&#39; char&#39;到指针headPtr。我想你想要做的就是和operator +=(char a)完全一样。那么为什么不打电话呢?
  3. 如果您更改&#39; + =(const char [])&#39;对于这种形式,这应该有所帮助:

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

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

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

    或者这个:

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

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

    我认为您与void string::operator += (const string& addend)存在同样的问题。