所以我正在完成一项家庭作业,在编写了我们自己的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;
}
非常感谢帮助!
答案 0 :(得分:0)
你是对的。问题是headPtr += addend[index];
,但也不是因为运算符过载,而是因为内存违规。这会将headPtr指针增加为addend [index]的ASCII值的多个字节,因此下次您将调用&#39;运算符+ =(char addend)&#39;它将把记忆写在某个地方&#34;空间&#34;。
我可以看到两个问题:
operator +=(char a)
完全一样。那么为什么不打电话呢?如果您更改&#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)
存在同样的问题。