2016-12-03 3 views
-3

Я писал код, и я использовал оператор '=' для назначения одного объекта другому и конструктора копирования. Вот кодПерегрузка '=' не работает

DJSet(const DJSet& ds) 
{ 
    vector<Element<T>* > vec= ds.v_; 
    for (int i = 0; i < vec.size(); i++) 
    { 
     v_.push_back(vec[i]); 
    } 
    //cout << "Copy Called\n"; 
} 
DJSet operator=(DJSet ds) 
{ 
    DJSet<T> djs; 
    vector<Element<T>* > vec = ds.v_; 
    for (int i = 0; i < vec.size(); i++) 
    { 
     djs.v_.push_back(vec[i]); 
    } 
    cout << "= Called\n"; 
    return djs; 
} 

Класс DJSet содержит только один вектор Element<T>* type Итак, когда я выполнить код, приведенный ниже.

DJSet<string> djs_rhs; 
    DJSet<string> djs_lhs; 
    cin >> name; 
    djs_rhs.add(name); 
    cin >> name; 
    djs_rhs.add(name); 

    cin >> name; 
    djs_lhs.add(name); 
    cin >> name; 
    djs_lhs.add(name); 

    djs_lhs = djs_rhs; 
    cout << djs_lhs << endl; 
    cout << endl; 
    cout << djs_rhs << endl; 

Это не копируют значения с правой стороны к левой стороне объектов И звонит как конструктор копирования и оператор «=». Пожалуйста, помогите мне с этим. Как я могу продолжать это? Я могу предоставить весь исходный код, если вы хотите.

ответ

1

DJSet operator=(DJSet ds) - это принимает аргумент ds по значению, поэтому компилятор будет вызывать конструктор копирования всякий раз, когда используется оператор присваивания. Измените его на DJSet operator=(const DJSet& ds) для передачи по ссылке, чтобы код здесь не копировался.

DJSet<T> djs; - это создает 44 местный объект, а вся остальная часть кода изменяет этот локальный объект. В конце оператора присваивания локальный объект уничтожается, и вся работа над ним отбрасывается. Избавиться от этого.

vector<Element<T>* > vec = ds.v_; - это делает локальную копию вектора, который затем используется для установки значений внутри объекта. Это не нужно; вы можете копировать прямо с ds.v_, без этого дополнительного вектора. Избавьтесь от него и смените djs.v_.push_back(vec[i]); на v_.push_back(ds.v_).

2

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

DJSet &operator=(const DJSet &ds) 
{ 
    // Fill in the blank. 

    return *this; 
} 

Кроме того, как показано, оператор = должен принять const ссылочный параметр, а не новый временный объект.

Вам нужно будет заполнить пробелы и выполнить то, что вам нужно, чтобы заменить содержимое *this содержимым объекта, переданного в качестве параметра.

0

Операционный = jould быть:

DJSet &operator=(const DJSet &ds) 
{ 
    vector<Element<T>* > vec = ds.v_; 
    for (int i = 0; i < vec.size(); i++) 
    { 
     v_.push_back(vec[i]); 
    } 
    cout << "= Called\n"; 
    return *this; 
} 

В своей реализации, вы не MODIF левый объект, а временный. Обычно копирование конструктора и оператора = должно быть почти идентичным, за исключением последнего возврата * этого.

 Смежные вопросы

  • Нет связанных вопросов^_^