编译重载运算符时,指针出现异常。异常显示“引发异常:写访问冲突。 TempString.Pointer为0x1110112。“我希望操作员将两个自定义字符串组合为一个。
运算符重载:
MyString MyString::operator+(MyString &String) {
MyString TempString;
TempString.StringLength = this->StringLength + String.StringLength;
for (int i = 0; i < this->StringLength + String.StringLength - 1; i++) {
if (i < this->StringLength) {
TempString.Pointer[i] = this->Pointer[i]; // Exception pops up here
}
else {
TempString.Pointer[i] = String.Pointer[i];
}
}
return TempString;
};
构造函数:
MyString::MyString() {
StringLength = 0;
Pointer = nullptr;
}
MyString::MyString(char* String) {
Pointer = String;
for (int i = 0; Pointer[i]; i++) {
StringLength++;
}
}
Main.cpp:
#include "MyString.h"
#include <iostream>
int main() {
char String1[] = "abcdef";
MyString NewString(String1);
char String2[] = "cdefa";
MyString SubString(String2);
MyString BrandNewString(NewString + SubString);
cout << BrandNewString.GetStringLength() << endl;
system("pause");
return 0;
}
答案 0 :(得分:0)
该行:
TempString.StringLength = this->StringLength + String.StringLength;
不为您的字符串分配内存。
您需要先分配内存,然后再写入(在第TempString.Pointer[i] = this->Pointer[i]
行中)。
可以显示构造函数的内容吗?
您编写的是一个只读字符串类。它附加到外部char数组。
很不幸,但是您不能对其进行突变。请注意,您可以修改外部char数组的内容,但不能修改大小。
要进行串联(例如在abc
+ def
中进行创建),您需要创建一个与两个初始数组的长度之和一样大的数组,但是您的任何地方都没有这样的数组码。
因此,您需要首先创建它们(这通常称为分配,通常使用operator new
,可以使用malloc
,但随后,您的类将无法知道其指向的数组到自己分配或来自其他任何地方。因此,您的类将无法取消分配数组。
因此,您应该选择希望班级执行的情景:
std::string
类,现在正在这样做。在串联运算符中,应该具有的逻辑:
MyString MyString::operator+(const MyString & o) const {
MyString ret(length + o.length);
for(int i = 0; i < length; i++)
ret.pointer[i] = pointer[i];
for(int i = 0; i < o.length; i++)
ret.pointer[i+length] = o.pointer[i];
return ret;
}
MyString::MyString(int length)
: length(length), pointer(new char[length+1])
{
pointer[length] = 0;
}
MyString::~MyString() { delete[] pointer; pointer = nullptr; length = 0; }
MyString::MyString(const char * str)
: length(strlen(str)), pointer(new char[length+1])
{
memcpy(pointer, str, length+1);
}