运算符为自己的字符串重载 (+=,=)

Operators overloading (+=,=) for own strings

我正在尝试创建自己的 class 字符串。 我在运算符重载方面遇到了一些问题。

My_string.h

  #include <cstring>
  #include <iostream>
    class My_string
    {
    private:
        char *value;
    public:
        My_string();
        My_string(char *);
        ~My_string();
        My_string operator +=(const My_string&);
        My_string operator =(const My_string&);
        void show()const;
    };

My_string.cpp

#include "stdafx.h"
#include "My_string.h"


My_string::My_string()
{
    value = new char[1];
    strcpy(value, "");
}

My_string::My_string(char * r_argument)
{

    value = new char[strlen(r_argument) + 1];
    strcpy(value, r_argument);
}

My_string::~My_string()
{
    delete[]value;
}

My_string My_string::operator+=(const My_string &r_argument)
{
    char * temp_value = new char[strlen(value) + strlen(r_argument.value) + 1];
    strcpy(temp_value, value);
    strcat(temp_value,r_argument.value);
    delete[]value;
    value = new char[strlen(value) + strlen(r_argument.value) + 1];
    strcpy(value, temp_value);
    delete[]temp_value;
    return *this;
}

void My_string::show() const
{
    std::cout << value << std::endl;
}

My_string My_string::operator =(const My_string & r_argument)
{
    delete[] value;
    value = new char[strlen(r_argument.value)+1];
    strcpy(value, r_argument.value);
    return *this;
}

如何重载 += 和 = 运算符?它们都会导致运行时错误。我需要所有都在动态分配的内存中。

调试断言失败! ... 表达式:_CrtisValidHeapPointer(block).

operator+=operator= 通常 return 引用 this.

目前您正在return按值,它正在使用compiler-generated复制构造函数。该构造函数获取数据缓冲区指针 value,这是导致崩溃的根本原因:指针上的多个 delete[] 不会很好地结束!

首先研究 "Rule Of 3",构建复制构造函数和赋值运算符,修复重载运算符 return 类型,然后从那里继续。

至少当一个对象被分配给它自己时,复制赋值运算符包含一个严重的错误,因为首先它被删除了。此外,运营商应该 return 引用他们自己。

嗯,算子可以这样定义

My_string & My_string::operator +=( const My_string &r_argument )
{
    if ( r_argument.value[0] )
    { 
        char *temp_value = new char[strlen(value) + strlen(r_argument.value) + 1];
        strcpy(temp_value, value);
        strcat(temp_value,r_argument.value);

        delete [] value;
        value = temp_value;
    }

    return *this;
}

My_string & My_string::operator =( const My_string &r_argument )
{
    if ( this != &r_argument )
    {
        char *temp_value = value;

        size_t n = strlen( r_argument.value );

        if ( n != strlen( value ) )
        {
            temp_value = new char[ n + 1 ];
        }
        else
        {
            value = nullptr;
        }

        strcpy( temp_value, r_argument.value );

        delete [] value;

        value = temp_value;
    }

    return *this;
}

考虑到您还需要显式定义复制构造函数。