Возвращение глубоких копий объектов при перегрузке оператора = - PullRequest
0 голосов
/ 25 марта 2011

Итак, я делаю контейнерный класс для целых чисел и хочу перегрузить оператор =, чтобы я мог вернуть глубокую копию объекта.Мой код работает , но два объекта указывают на один и тот же адрес.Это файл main.cpp:

int main (int argc, const char * argv[]) {
    IntList cArray(5);

    for (int i = 0; i < cArray.getLength(); i++) {
        cArray[i] = (i + 1) * 10;
    }

    using namespace std;

    for (int i = 0; i < cArray.getLength(); i++)
        cout << cArray[i] << " ";
    cout << endl << popped << endl;

    IntList cArray2(4);

    for (int i = 0; i < cArray2.getLength(); i++)
        cArray2[i] = i * 5;

    cArray2 = cArray;
    cArray2[2] = 1000;

    for (int i = 0; i < cArray.getLength(); i++)
        cout << cArray[i] << " ";
    cout << endl;
    for (int i = 0; i < cArray2.getLength(); i++)
        cout << cArray2[i] << " ";
    cout << endl;

    return 0;
}

Это файл заголовка для IntList класса:

class IntList {
private:
    int _length;
    int* _data;

public:
    IntList(int length);
    ~IntList();

    void erase();
    void reallocate(int length);    //  Faster way to call erase() and resize()
    void resize(int length);
    void insert(int value, int index);
    void prepend(int value);
    void append(int value);
    int pop(int index);
    void removeBefore(int index);    //  Exclusive
    void removeAfter(int index);    //  Exclusive
    int getLength();
    int indexOf(int value);

    int& operator[](int index);
    IntList operator=(IntList* source);
};

И это реализация IntClass 's operator=() метод:

IntList IntList::operator=(IntList* source) {
    _length = source->getLength();

    reallocate(_length);

    for (int i = 0; i < _length; i++) {
        _data[i] = (*source)[i];
    }

    return *this;
}

Ответы [ 4 ]

2 голосов
/ 25 марта 2011

Поскольку ваш оператор присваивания принимает указатель на IntList, вам необходимо вызвать его следующим образом:

cArray2 = &cArray;

В вашем примере кода используется оператор присваивания по умолчанию, сгенерированный вашим компилятором.Ваш оператор присваивания должен иметь это объявление вместо:

IntList& IntList::operator=(IntList const& source)
2 голосов
/ 25 марта 2011

Вы не работаете с указателями на IntList - operator= обычно принимает const & и возвращает ссылку на экземпляр, которому назначен.

IntList & IntList::operator=(IntList const & source) {
  ...
  return *this;
}

Помните, что вам также нуженконструктор копирования: IntList(IntList const & source)

Вы можете сделать оператор =, который принимает указатель на IntList - это будет работать, только если вы сделаете что-то подобное:

IntList l1;
IntList l2;
l1 = &l2;

Это не типичное использование, и вы должны быть явным, если вам требуется, используйте, например, void IntList::copyFrom(IntList const *) в этом случае.

Другие изменения, которые вы должны сделать:

Добавьте это:

int operator[](int index) const;

Сделайте эти константы:

int getLength() const;
int indexOf(int value) const;
1 голос
/ 25 марта 2011
IntList IntList::operator=(IntList* source) 

Неправильная подпись для operator=, так как ее тип параметра - указатель на IntList

Правильная подпись:

IntList & IntList::operator=(const IntList & source) //reference of source!
     //^^^ note this                      ^^^ note this as well!

То есть, сделать оба типа параметра, а также тип возвращаемого значения reference .

1 голос
/ 25 марта 2011

Вашему оператору нужна подпись IntList& operator=(const IntList& source);.Обратите внимание на ссылку вместо указателя, а также на то, что вы должны ВОЗВРАТИТЬ по ссылке, чтобы разрешить цепочку назначений.Когда вы передаете его указателем в любом месте, где требуется неявное присваивание, будет использоваться сгенерированный компилятором оператор мелкого копирования.

EDIT: вам также нужно сделать getLength const, чтобы его можно было вызывать внутриоператор присваивания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...