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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
List2006
24 / 16 / 2
Регистрация: 19.12.2009
Сообщений: 366
#1

Перегрузка внешней функции операции "operator=" - C++

02.09.2011, 16:17. Просмотров 1643. Ответов 11
Метки нет (Все метки)

1) Возможна ли перегрузка внешней функцией операции "operator="?
Чтобы скажем выполнить нечто:
int = объект

2) Компилятор (mingw) при попытки объявить перегрузку внешней функции - ругается что функция должна быть не статичной? Хотелось бы понять контекст этого ошибки, то есть функция "operator=" определяется как статическая?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LosAngeles
Заблокирован
02.09.2011, 16:20     Перегрузка внешней функции операции "operator=" #2
покажи чё ты хочешь, код
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.09.2011, 16:23     Перегрузка внешней функции операции "operator=" #3
Цитата Сообщение от List2006 Посмотреть сообщение
Чтобы скажем выполнить нечто:
int = объект
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
class myclass {
    int num;
public:
    myclass(int a = 0) : num(a) {}
 
    operator int()
    {
        return num;
    }
};
 
int main()
{
    myclass obj(100500);
    int t = obj;
    std::cout << t << '\n';
    return 0;
}
List2006
24 / 16 / 2
Регистрация: 19.12.2009
Сообщений: 366
02.09.2011, 16:27  [ТС]     Перегрузка внешней функции операции "operator=" #4
для вопроса 1 код не нужен, мне нужно знать допускается или нет.
для 2 вопроса можно воссоздать код самим ( в реальности я думаю просто не допускается такая перезагрузка, и поэтому генерируется соответствующие "странное" замечание, если не так кину код).

Добавлено через 1 минуту
Цитата Сообщение от Jupiter Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
class myclass {
    int num;
public:
    myclass(int a = 0) : num(a) {}
 
    operator int()
    {
        return num;
    }
};
 
int main()
{
    myclass obj(100500);
    int t = obj;
    std::cout << t << '\n';
    return 0;
}
спасибо, но я знаю это решение о неявном преобразование, мне важно именно ответ на вопрос мой.
LosAngeles
Заблокирован
02.09.2011, 16:29     Перегрузка внешней функции операции "operator=" #5
Цитата Сообщение от List2006 Посмотреть сообщение
для вопроса 1 код не нужен, мне нужно знать допускается или нет.
да, допускается
на второй скидывай код не самому же писать
List2006
24 / 16 / 2
Регистрация: 19.12.2009
Сообщений: 366
02.09.2011, 16:50  [ТС]     Перегрузка внешней функции операции "operator=" #6
Пожалуйста код:
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
28
29
30
31
32
#include <iostream>
using std::cout;
using std::endl;
 
class Test
{
    friend int &operator=(int &iv, Test &c);
    
public:
    Test(int i) : in(i)
    {
        //empty
    }
    
    int in;
private:
};
 
int &operator=(int &iv, Test &c)
{
    iv = c.in;
    return iv;
}
 
int main (int argc, char** argv)
{
    int tiv = 5;
    Test tc = 10;
    
    std::cin.get();
    return 0;
}
Вывод (mingw):
Код
004.cpp:7:40: error: 'int& operator=(int&, Test&)' must be a nonstatic member function
004.cpp:19:32: error: 'int& operator=(int&, Test&)' must be a nonstatic member function
Добавлено через 47 секунд
Меняешь "=" на "<<" и все норм, а тут ошибка.
LosAngeles
Заблокирован
02.09.2011, 16:54     Перегрузка внешней функции операции "operator=" #7
извиняюсь, я чё то == прочитал

Добавлено через 2 минуты
тогда всё правильно твой компилятор говорит
004.cpp:7:40: error: 'int& operator=(int&, Test&)' must be a nonstatic member function
List2006
24 / 16 / 2
Регистрация: 19.12.2009
Сообщений: 366
02.09.2011, 16:57  [ТС]     Перегрузка внешней функции операции "operator=" #8
Цитата Сообщение от LosAngeles Посмотреть сообщение
извиняюсь, я чё то == прочитал
значит нельзя?

PS конечно и слава богу что так нельзя. Может кто пруф кинуть где есть нечто типа таблицы - "что и как можно перегружать"?

Добавлено через 1 минуту
Цитата Сообщение от LosAngeles Посмотреть сообщение

Добавлено через 2 минуты
тогда всё правильно твой компилятор говорит
А как это понять? Он делает эту функцию статической? Но по определению статическая может обращаться только к статическим данным же?
LosAngeles
Заблокирован
02.09.2011, 16:58     Перегрузка внешней функции операции "operator=" #9
final draft C++11

13.5.3 Assignment [over.ass]

1 An assignment operator shall be implemented by a non-static member function with exactly one parameter.
Because a copy assignment operator operator= is implicitly declared for a class if not declared by the
user (12.8), a base class assignment operator is always hidden by the copy assignment operator of the
derived class.
List2006
24 / 16 / 2
Регистрация: 19.12.2009
Сообщений: 366
02.09.2011, 16:59  [ТС]     Перегрузка внешней функции операции "operator=" #10
или он делает статическое все то что нельзя перезагружать (отсюда и паника компилятора)?
LosAngeles
Заблокирован
02.09.2011, 17:03     Перегрузка внешней функции операции "operator=" #11
Цитата Сообщение от List2006 Посмотреть сообщение
Он делает эту функцию статической
Цитата Сообщение от LosAngeles Посмотреть сообщение
non-static member function with exactly one parameter
understand?

Добавлено через 2 минуты
в стандарте же и поясняется почему оператор= не может быть представлен иначе - потому что он неявно впихивается, если юзер ничего не написал. А это морока для разработчиков компилятора и простых разработчиков

Добавлено через 1 минуту
Цитата Сообщение от List2006 Посмотреть сообщение
Может кто пруф кинуть где есть нечто типа таблицы - "что и как можно перегружать"?
13.5 Overloaded operators
довольно хорошо всё расписано)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2011, 17:08     Перегрузка внешней функции операции "operator="
Еще ссылки по теме:
C++ Перегрузка операции "%=" глобальной фунцкцией
C++ Классы: перегрузка операции "Бинарный +"
Перегрузить операторы operator+() и operator*() в пользовательском классе "Комплексное число" C++
Перегрузка операции "<=" C++
C++ Перегрузка операции "++"

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

Или воспользуйтесь поиском по форуму:
List2006
24 / 16 / 2
Регистрация: 19.12.2009
Сообщений: 366
02.09.2011, 17:08  [ТС]     Перегрузка внешней функции операции "operator=" #12
все, понял, что вне main у нас же статическая "память"

Добавлено через 4 минуты
мне кажется причина как раз не в этом (не в случаи когда перезагрузка идет в методе), просто если внешне так написать и какой нибудь объект к другому присваивается то, это может вызвать неопределенные состояния (что делать - преобразовывать правый объект, или вызвать у него операцию присвоения, но и у левого объекта уже есть операция присвоения).
Yandex
Объявления
02.09.2011, 17:08     Перегрузка внешней функции операции "operator="
Ответ Создать тему
Опции темы

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