Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перегрузка бинарных операторов, прошу объяснить 
:(
    Опции темы
skyboy
Дата 16.4.2007, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



есть класс. имя, правда, у него немного "неадекватное" smile
Код

class charList
{
    private: int k;
    public: charList(void) {
                this->k= 0;
            }
    public: charList(int _k) {
                this->k= _k;
            }
    public: int setK(const int _k) {
        this->k= _k;
        return this->k;
    }
    public: int getK(void) {
        return this->k;
            }
    public: charList operator=(charList another) {
                this->setK(another.getK());
                return *this;
            }
    public: charList operator+(charList another) {
                charList result;
                result.setK(this->getK() + another.getK());
                return result;
            }
    public: charList operator+(charList* another) {
                charList result;
                result.setK(this->getK() + another->getK());
                return result;
            }
    public: ~charList()
            {
                cout<<"i have been destroyed!("<<this->getK()<<")\n";
            }
};


создаю объект класса:
Код

charList* zero= new charList(0);

строка 
Код

zero + zero;

вызывает сообщение об ошибке:
Цитата

error C2110: cannot add two pointers

Ну, ладно- думаю я,- получи.
И делаю ход конем:
Код

zero= zero->operator +(zero);

на оператор + не ругается(!), зато сообщает
Цитата

error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'class charList' (or there is no acceptable conversion)

Будьте добры, поясните, что я не понимаю в логике перегрузки, что допускаю такие ошибки?
------
VC++ 6.0
PM MAIL   Вверх
archimed7592
Дата 16.4.2007, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(skyboy @  16.4.2007,  22:00 Найти цитируемый пост)
    
zero= zero->operator +(zero);
operator+ возвращает НЕуказатель, а ты пытаешься засунуть это в указатель...
нужно делать *zero + *zero


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
powerfox
Дата 16.4.2007, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Цитата(skyboy @  16.4.2007,  23:00 Найти цитируемый пост)
создаю объект класса:
Выделить всёкод C++
1:
    
charList* zero= new charList(0);

строка 
Выделить всёкод C++
1:
    
zero + zero;

вызывает сообщение об ошибке:
Цитата

error C2110: cannot add two pointers


Гм... А зачем складывать указатели в таком контексте? У тебя и сложение элементов и указателей одинаковы...


Цитата(skyboy @  16.4.2007,  23:00 Найти цитируемый пост)
    
zero= zero->operator +(zero);

zero у тебя указатель, а не твой объект. Вот и ругается.

Добавлено через 6 минут и 26 секунд
Цитата(powerfox @  16.4.2007,  23:12 Найти цитируемый пост)
Гм... А зачем складывать указатели в таком контексте? У тебя и сложение элементов и указателей одинаковы...

Какой-то бред сморозил.


--------------------
user posted image
PM WWW   Вверх
skyboy
Дата 16.4.2007, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Цитата(archimed7592 @  16.4.2007,  21:06 Найти цитируемый пост)
operator+ возвращает НЕуказатель, а ты пытаешься засунуть это в указатель...

Цитата(powerfox @  16.4.2007,  21:12 Найти цитируемый пост)
zero у тебя указатель, а не твой объект. Вот и ругается.

а как же перегрузка  оператора присвоения:
Цитата(skyboy @  16.4.2007,  21:00 Найти цитируемый пост)
public: charList operator=(charList another)
? идет лесом? так делать нельзя? 
Цитата(powerfox @  16.4.2007,  21:12 Найти цитируемый пост)
А зачем складывать указатели в таком контексте? У тебя и сложение элементов и указателей одинаковы...

не совсем понял мысль. я перегрузил оператор +. по моей внутренней логике, после перегрузки object1+object2 должно складывать не указатели, а вызывать всё тот же object1->operator+(object2). Только неявно. Но, почему-то, не вызывает. Значит моё виденье работы перегрузки операторов неверно.

PM MAIL   Вверх
archimed7592
Дата 16.4.2007, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(skyboy @  16.4.2007,  22:00 Найти цитируемый пост)

на оператор + не ругается(!)
и не должен - это вполне себе нормальное имя ф-ции ;)

зы. в идеале, толку от *zero + *zero нету - они складываются, но результат игнорируется...
пиши *a = *b + *c или *a+=*b


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
skyboy
Дата 16.4.2007, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Цитата(powerfox @  16.4.2007,  21:12 Найти цитируемый пост)
Какой-то бред сморозил. 

сам сказал, сам откоммнетился  smile

Добавлено через 2 минуты и 32 секунды
Цитата(archimed7592 @  16.4.2007,  21:27 Найти цитируемый пост)
в идеале, толку от *zero + *zero нету

это я отделил ошибку касательно перегрузки оператора присвоения от ошибки перегрузки оператора сложения smile вычленил, так сказать smile
да и пример, если не заметно  smile соверщенно учебный... 
PM MAIL   Вверх
archimed7592
Дата 16.4.2007, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(skyboy @  16.4.2007,  22:27 Найти цитируемый пост)
а как же перегрузка  оператора присвоения:
Цитата(skyboy @  16.4.2007,  21:00 Найти цитируемый пост)
public: charList operator=(charList another)
? идет лесом? так делать нельзя? 
ну и что тебе эта перегрузка(делающая двойную работу, кстати) даёт? возможно писать
Код
charList a, b;
a = b;
не больше... можешь сделать ещё charList operator=(charList *another), тогда можно будет писать
Код
charList a, *zero = new charList (0);
a = zero;


Добавлено через 58 секунд
Цитата(archimed7592 @  16.4.2007,  22:31 Найти цитируемый пост)
делающая двойную работу, кстати
тройную! smile 


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
skyboy
Дата 16.4.2007, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Цитата(archimed7592 @  16.4.2007,  21:06 Найти цитируемый пост)
нужно делать *zero + *zero 

поясни, пожалуйста, почему. у меня ведь есть вариант перегрузки оператора + для правого операнда  типа charList(без указателя-звёздочки).
А слева, как я понял, без разыменовывания не обойтись, да?

Добавлено через 2 минуты и 24 секунды
Цитата(archimed7592 @  16.4.2007,  21:31 Найти цитируемый пост)
делающая двойную работу, кстати

вот здесь подробнее. что, неявно вызывается несколько раз? или что?
Цитата(archimed7592 @  16.4.2007,  21:31 Найти цитируемый пост)
ну и что тебе эта перегрузка (....) даёт?

Цыц! Я изучаю перегрузку на простых примерах. Сам её(перегрузку операторов), кстати, считаю злом - интерфейсы куда "прозрачнее" и ортодоксальнее. да и с С++ знаком слабо... 

PM MAIL   Вверх
powerfox
Дата 16.4.2007, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



skyboy, перегрузка и разыменование не есть одно и то же.



--------------------
user posted image
PM WWW   Вверх
archimed7592
Дата 16.4.2007, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(skyboy @  16.4.2007,  22:34 Найти цитируемый пост)
А слева, как я понял, без разыменовывания не обойтись, да? 
да... можно *zero + zero...
про operator =: писать нужно так
Код
myClass &operator = (const myClass &another)
как и для operator +
Код
charList operator+(const charList &another) const

а ты из java к нам пожаловал видимо smile

Добавлено @ 22:41
Цитата(skyboy @  16.4.2007,  22:34 Найти цитируемый пост)
что, неявно вызывается несколько раз?
конструктор копирования smile
type var - передача по значению
type &var - по ссылке
const type &var - по ссылке (объект изменить нельзя)

Добавлено @ 22:42
Цитата(skyboy @  16.4.2007,  22:34 Найти цитируемый пост)
интерфейсы куда "прозрачнее" и ортодоксальнее.
ну и пользуй наздоровье... они медленее правда, ну да ладно smile

Это сообщение отредактировал(а) archimed7592 - 16.4.2007, 22:43


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
skyboy
Дата 16.4.2007, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Цитата(powerfox @  16.4.2007,  21:38 Найти цитируемый пост)
skyboy, перегрузка и разыменование не есть одно и то же.

ээээ.... это ты к чему? спасибо, я уже не мальчик в курсе, что не одно и то же smile а идею не внял.
PM MAIL   Вверх
powerfox
Дата 16.4.2007, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Цитата(skyboy @  16.4.2007,  23:46 Найти цитируемый пост)
ээээ.... это ты к чему? спасибо, я уже не мальчик в курсе, что не одно и то же smile а идею не внял. 


Цитата(skyboy @  16.4.2007,  23:00 Найти цитируемый пост)
    public: charList operator+(charList* another) {
                charList result;
                result.setK(this->getK() + another->getK());
                return result;

К тому, что этот код не означает, что будет возможно делать:
Код

charList* el1;
charList summ;
charList el;

summ = el + el1;




--------------------
user posted image
PM WWW   Вверх
skyboy
Дата 16.4.2007, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Цитата(archimed7592 @  16.4.2007,  21:39 Найти цитируемый пост)
а ты из java к нам пожаловал видимо

льстишь smile с Java только вторую неделю знакомлюсь smile))) РНР, Delphi... 
Цитата(archimed7592 @  16.4.2007,  21:39 Найти цитируемый пост)
ну и пользуй наздоровье... 

я что - я бы с радостью. Брата вот выручать приходится smile 

Цитата(archimed7592 @  16.4.2007,  21:39 Найти цитируемый пост)
const charList &another

const charList &another и charList* another - тут имеется радикальная разница?
А вот при использовании такой штуки:
Цитата(archimed7592 @  16.4.2007,  21:39 Найти цитируемый пост)
charList operator+(const charList &another) const

объект-результат создастся на стеке, да? если да, то вариант передачи правого операнда const another по ссылке меня удивляет. А как же случай:
object1 + (object2 + object3)? 
при выполнении object2 + object3 будет создан объект(а не указатель на него). Получается при работе object1 + result[object2 + object3] будет сложение указателя на класс(charList* object1) и объекта-значения на стеке(charList result), а перегруженного оператора + нет. Или - и не надо? я прошу даже не столько коррекции кода(мне потом сложнее код писать придется), а именно растолковывания, что я неверно разумею smile Если придется растолковывать много - пожалуйста, ткните в конкретное(чтоб за ночь осилить) чтиво. Спасибо smile
PM MAIL   Вверх
Daevaorn
Дата 16.4.2007, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Твой оператор работает с объектами, не с указателями. Что тут не понятного? Складывать два указателя ка-то не логично в данном случаеsmile
PM MAIL WWW   Вверх
skyboy
Дата 16.4.2007, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



powerfox, почему не пройдет?  тип параметра в сигнатуре перегрузки оператора и тип правого операнда не совпадают разве?

Добавлено через 1 минуту и 27 секунд
Цитата(Daevaorn @  16.4.2007,  21:57 Найти цитируемый пост)
Твой оператор работает с объектами, не с указателями. Что тут не понятного? Складывать два указателя ка-то не логично в данном случае

угу. наконец-то понял, спасибо smile  а ведь и раньше то же самое говорили.... smile)))
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1030 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.