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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
RocBoy-D
32 / 31 / 7
Регистрация: 10.03.2012
Сообщений: 362
#1

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

16.02.2014, 02:27. Просмотров 336. Ответов 4
Метки нет (Все метки)

Здравствуйте! При попытке заменить объект пользовательского класса 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, вроде работает
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2014, 02:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка оператора = (C++):

Перегрузка оператора += - C++
У меня имеется структура и метод, который вызывается след образом: A.plus_and_minus(B); Есть огромное желание перегрузить функцию += ,...

Перегрузка оператора = - C++
Есть некий класс. И два класса-наследника. Надо перегрузить оператор =, к тому же в дочерних классах вызывать перегрузку в базовом классе....

Перегрузка оператора = - C++
помогите создать перегруженный оператор = в классе Х, который будет копировать содержание строки S1 в S2.

Перегрузка оператора = - C++
Как перегрузить оператор = для char ?

Перегрузка оператора - C++
Подскажите пожалуйста, способ перегрузки операторов &gt;= и &lt;= в следующей строке if ( ob.str &gt;= '0' &amp;&amp; ob.str &lt;= '9' )Мой вариант не...

Перегрузка оператора != - C++
Помогите разобраться с перегрузкой оператора != есть класс, в котором, в разделе private объявлен указатель на массив std::string *str; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
16.02.2014, 02:36 #2
RocBoy-D, начнем с того. что в операторе "=" у Вас утечка памяти, ибо Вы не освобождая память, сразу присваиваете указателю другое значение.
1
RocBoy-D
32 / 31 / 7
Регистрация: 10.03.2012
Сообщений: 362
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;
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
16.02.2014, 02:49 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
А теперь про изменение элемента множества. В множествах нельзя менять элементы, поскольку они отсортированы, если Вы изменили элемент, значит Вы нарушили порядок, что недопустимо в множествах, отсюда вывод, так делать нельзя можете почитать тут

Добавлено через 2 минуты
Цитата Сообщение от RocBoy-D Посмотреть сообщение
delete [] array;
если указатель уже до этого был NULL( не вижу реализации кода, но подозреваю, что в конструкторе по умолчанию именно это значение принимает указатель), то строка выше вызовет ошибку. так что стоит проверить на равенство NULL, а потом уже удалять(зависит от компилятора).
1
DrOffset
7138 / 4279 / 964
Регистрация: 30.01.2014
Сообщений: 7,067
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
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.02.2014, 02:56
Привет! Вот еще темы с ответами:

перегрузка оператора () - C++
Вопрос заключается в следующем: - Что собой представляет перегружаемый оператор()? - Как его перегрузить? ( обычные операторы тип ++ и...

Перегрузка оператора == - C++
Пытаюсь перегрузить оператор == . Делаю так: В классе: class cData // класс дата { int year; // год short mounth; //...

Перегрузка оператора += - C++
Создал класс дробь. Пытаюсь перегрузить оператор += (или -=, *=, /=) А компилятор выдаёт ошибку 'drob operator+=(drob&amp;)' must take...

Перегрузка оператора [] - C++
Сделал простой аналог auto_ptr для дин. массива. Файл #ifndef ARRAY_PTR_GUARD #define ARRAY_PTR_GUARD template&lt; class Ty_ &gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.02.2014, 02:56
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru