C++ 带有链表的重载 += 运算符
C++ Overloaded += operators with a linked list
所以我正在做一个家庭作业,在使用动态字符数组编写了我们自己的 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("时,它会将内存写入"空间不足"的地方。
我可以看到两个问题:
- 您可以简化对"addend"变量的迭代(请参阅下面的示例(。
- 您正在尝试将"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)
也有同样的问题.
相关文章:
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- <T> 通过模板化运算符重载将 std::complex 乘以双倍
- C++20概念:需要运算符重载
- 使用赋值运算符重载从类中返回jobject
- 在运算符重载定义中使用成员函数(const错误)
- 字节到位运算符重载C++
- 为什么在运算符重载时需要参考?
- 类中 c++ 的运算符 + 重载
- 算术复合运算符重载为非成员
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 交换运算符 + 重载会导致无限递归
- 如何理解新的运算符重载?
- 向量保持复数的运算符重载
- 如何创建运算符重载?
- 链接列表运算符重载没有打印出我想要的内容
- C++:需要帮助了解运算符重载错误
- 使用模板化运算符重载 XOR 运算符失败
- 如何确保接受的C++模板类型使运算符重载?
- 运算符重载使用运算符+添加类模板