gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:50:01 24 4
gpt4 key购买 nike

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

我认为问题与线路有关:

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 值一样多的字节数,因此下次您调用“operator += (char addend)”时,它会将内存写入“空间不足”的某处。

我可以看到两个问题:

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

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

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

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

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

或者这个:

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

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

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

关于C++ 重载 += 带有链表的运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49473483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com