Форум программистов, компьютерный форум CyberForum.ru

Перегрузка оператора = - C++

Восстановить пароль Регистрация
 
RocBoy-D
32 / 31 / 6
Регистрация: 10.03.2012
Сообщений: 361
16.02.2014, 02:27     Перегрузка оператора = #1
Здравствуйте! При попытке заменить объект пользовательского класса q4 на q6 в контейнере set появляется ошибка: error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const Queue' (or there is no acceptable conversion). Как правильно перегрузить оператор = ? Интерфейс класса:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <iomanip>
 
using namespace std;
 
class Queue
{
    char *array;
    int N;
   public:
    Queue ();
    Queue (int);
    Queue (char *, int);
    Queue (const Queue &);
    void Add (char);
    int In (char);
    char Get ();
    char *Get_Queue () const;
    int Get_Length () const;
    char &operator [] (int);
    Queue &operator = (const Queue &);
    friend bool operator == (const Queue &, const Queue &);
    friend bool operator < (const Queue &, const Queue &);
    friend istream &operator >> (istream &, Queue &);
    friend ostream &operator << (ostream &, Queue &);
    ~Queue ();
};
Перегрузил вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
Queue &Queue :: operator = (const Queue &obj)
{
    if (this == &obj)
        return *this;
 
    N = obj.N;
    array = new char [obj.N + 1];
    strcpy (array, obj.array);
 
    return *this;
}
А в main меняю объекты:
C++
1
2
3
4
5
6
7
8
9
set <Queue> exemple1;
    Queue q1 ("queue 1", 7), q2 ("queue 2", 7), q3 ("queue 3", 7), q4 ("queue 4", 7), q6 ("queue 6", 7);
 
        exemple1.insert (q1);
    exemple1.insert (q2);
    exemple1.insert (q3);
    exemple1.insert (q4);
 
       replace (exemple1.begin(), exemple1.end(), q4, q6);
Спасибо!

Добавлено через 12 минут
Или все дело в том, что я использую контейнер set? Проверил эту же операцию с контейнером vector, вроде работает
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2014, 02:27     Перегрузка оператора =
Посмотрите здесь:

C++ Перегрузка оператора %
Перегрузка оператора = C++
Перегрузка оператора C++
C++ перегрузка оператора
C++ Перегрузка оператора
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
16.02.2014, 02:36     Перегрузка оператора = #2
RocBoy-D, начнем с того. что в операторе "=" у Вас утечка памяти, ибо Вы не освобождая память, сразу присваиваете указателю другое значение.
RocBoy-D
32 / 31 / 6
Регистрация: 10.03.2012
Сообщений: 361
16.02.2014, 02:45  [ТС]     Перегрузка оператора = #3
metaluga145, исправил, но все равно та же ошибка осталась
C++
1
2
3
4
5
6
7
8
9
10
        if (this == &obj)
        return *this;
 
    N = obj.N;
    delete [] array;
    array = NULL;
    array = new char [N + 1];
    strcpy (array, obj.array);
 
    return *this;
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
16.02.2014, 02:49     Перегрузка оператора = #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
А теперь про изменение элемента множества. В множествах нельзя менять элементы, поскольку они отсортированы, если Вы изменили элемент, значит Вы нарушили порядок, что недопустимо в множествах, отсюда вывод, так делать нельзя можете почитать тут

Добавлено через 2 минуты
Цитата Сообщение от RocBoy-D Посмотреть сообщение
delete [] array;
если указатель уже до этого был NULL( не вижу реализации кода, но подозреваю, что в конструкторе по умолчанию именно это значение принимает указатель), то строка выше вызовет ошибку. так что стоит проверить на равенство NULL, а потом уже удалять(зависит от компилятора).
DrOffset
6425 / 3799 / 880
Регистрация: 30.01.2014
Сообщений: 6,592
16.02.2014, 02:56     Перегрузка оператора = #5
Цитата Сообщение от metaluga145 Посмотреть сообщение
если указатель уже до этого был NULL( не вижу реализации кода, но подозреваю, что в конструкторе по умолчанию именно это значение принимает указатель), то строка выше вызовет ошибку. так что стоит проверить на равенство NULL, а потом уже удалять.
Это не так.
5.3.5/2
the value of the operand of delete may be a null pointer value, a pointer to a non-array object created by a previous new-expression, or a pointer to a subobject
Yandex
Объявления
16.02.2014, 02:56     Перегрузка оператора =
Ответ Создать тему
Опции темы

Текущее время: 21:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru