Как написать функцию присвоения объектов класса - PullRequest
0 голосов
/ 23 апреля 2020

Мне нужно назначить один объект другому, перегружая оператор "=". Написал код, но он не работает. В чем может быть проблема?

CString operator =(const CString& obj) {
        CString temp;
        temp.c = obj.c;
        temp.length = obj.length;
        return temp;
    }

Полный код:

#include <iostream>
using namespace std;

class CString {
private: 
    char* c;
    int length;
public:
    CString() {
        length = 0;
        c = new char[1];
        *c = 0;
    }
    CString(const char* s) { 
        length = strlen(s);
        c = new char[length + 1];
        for (int i = 0; i < length; i++) { c[i] = s[i]; }
        c[length] = '\0';
    }
    CString(int leng, char* payload) { 
        length = leng;
        c = payload;
    }
    ~CString() {
        delete[] c;
    }
    CString operator +(const CString& b) {
        int newlength = length + b.length;
        char* newstr = new char[newlength + 1];
        strcpy(newstr, c);
        strcpy(newstr + length, b.c);
        return CString(newlength, newstr);
    }
    void Show(void) { cout << c << endl; }
    CString operator =(const CString& obj) {
        CString temp;
        temp.c = obj.c;
        temp.length = obj.length;
        return temp;
    }
};

int main() {
    CString a("First, ");
    CString b("Second.");
    a = c;


    return 0;
}

1 Ответ

1 голос
/ 23 апреля 2020

Первый комментарий: пока вы указываете нетривиальный деструктор и, что еще важнее, назначение копирования, вам также необходимо указать конструктор копирования.

Далее оператор копирования должен вернуть ссылка на *this: это позволяет вам использовать цепочку следующим образом: 'a = b = c;'

Копирование-назначение может выглядеть так:

    CString& operator =(const CString& obj) {
        delete[] c;
        length = obj.length;
        c = new char[length + 1];
        for (int i = 0; i <= length; i++) { c[i] = obj.c[i]; }
        return *this;
    }

Однако, Принимая во внимание мой первый комментарий, вы можете выполнить копирование только один раз:

    CString(const CString& obj) {
        length = obj.length;
        c = new char[length + 1];
        for (int i = 0; i <= length; i++) { c[i] = obj.c[i]; }
    }

    CString& operator =(const CString& obj) {
        CString tmp(obj)
        swap(length, tmp.length);
        swap(c, tmp.c);
        return *this;
    }

Кроме того, ваш конструктор CString(int leng, char* payload) выглядит подозрительно. Вы понимаете, что строка c должна быть выделена с new (и будет удалена в деструкторе)?

...