【发布时间】:2016-02-26 17:51:16
【问题描述】:
我正在尝试在 C++ 中创建自定义字符串实现,但我遇到了重载运算符“+”的问题。我想将新字符串附加到现有字符串,当我尝试分配一个新的扩展字符串时,调试器会分配大约 12 个字节。我无法控制分配,他只是忽略了变量“长度”。代码如下:
class String
{
private:
char *ptrNiz;
public:
String(const char *niz = "")
{
ptrNiz = new char[strlen(niz)+1];
strcpy_s(ptrNiz, strlen(niz)+1, niz);
cout << "stvoren niz: " << ptrNiz << endl;
}
String(const String& refString)
{
ptrNiz = new char[strlen(refString.ptrNiz) + 1];
strcpy_s(ptrNiz, strlen(refString.ptrNiz) + 1, refString.ptrNiz);
cout << "Kopiran niz: " << ptrNiz << endl;
}
~String()
{
cout << "Unisten objekt: " << ptrNiz << endl;
delete[] ptrNiz;
}
int Length() const
{
return strlen(ptrNiz);
}
int CharAt(int i) const
{
return ptrNiz[i];
}
void Ispisi()
{
cout << ptrNiz << endl;
}
operator char*()
{
return ptrNiz;
}
String operator+=(const const String& ref)
{
const int const length = ref.Length() + this->Length() + 1;
char *temp = new char[length]; // ignores length and allocates more space
for (int i = 0; i < this->Length(); i++)
{
temp[i] = ptrNiz[i];
}
for (int j = 0; j < ref.Length(); j++)
{
temp[this->Length() + j] = ref.ptrNiz[j];
}
return String(temp);
}
};
【问题讨论】:
-
我建议你检查this binary arithmetic operator reference,它有一个重载
+=运算符的示例。现在尝试将其与您的进行比较,我认为您会发现您的操作员功能存在一些问题。该示例中提到的重要内容之一是它是一个 assignment,即对this的分配。从你的问题来看,我认为你混合了operator+和operator+=。 -
你是否甚至终止了新的字符串?看起来你只是复制两个字符串并在最后留下一个垃圾字符。
-
在你的描述中你说
operator+,但在你的代码中你有operator+=。 -
你好,运算符应该是+=,我们发现了一个问题,我没有在字符串末尾设置一个空数组'\0'。当然,我也会修复其余的代码错误。