我在代码的特定部分遇到了异常

时间:2019-09-06 17:06:12

标签: c++ class oop exception operator-keyword

编译重载运算符时,指针出现异常。异常显示“引发异常:写访问冲突。 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;
}

1 个答案:

答案 0 :(得分:0)

该行:

TempString.StringLength = this->StringLength + String.StringLength;

不为您的字符串分配内存。 您需要先分配内存,然后再写入(在第TempString.Pointer[i] = this->Pointer[i]行中)。

可以显示构造函数的内容吗?

您编写的是一个只读字符串类。它附加到外部char数组。

很不幸,但是您不能对其进行突变。请注意,您可以修改外部char数组的内容,但不能修改大小。 要进行串联(例如在abc + def中进行创建),您需要创建一个与两个初始数组的长度之和一样大的数组,但是您的任何地方都没有这样的数组码。

因此,您需要首先创建它们(这通常称为分配,通常使用operator new,可以使用malloc,但随后,您的类将无法知道其指向的数组到自己分配或来自其他任何地方。因此,您的类将无法取消分配数组。

因此,您应该选择希望班级执行的情景:

  1. 保留只读类(您将无法执行串联或任何更改数组大小的操作)。
  2. 成为真正的字符串类(您必须在构造函数中分配一个char数组,然后在析构函数中对其进行分配),然后将接收到的字符串复制到您自己的托管数组中。在编写此类时,您应该看看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);
}