24 / 16 / 3
Регистрация: 19.12.2009
Сообщений: 366
1

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

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

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

2) Компилятор (mingw) при попытки объявить перегрузку внешней функции - ругается что функция должна быть не статичной? Хотелось бы понять контекст этого ошибки, то есть функция "operator=" определяется как статическая?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.09.2011, 16:17
Ответы с готовыми решениями:

Перегрузка "operator =" для шаблона класса
как правильно перегрузить operator= для щаблона, по идее я принимаю 2 ссылки на объекты этого...

Перегрузка операторов: "operator #"
Здравствуйте, подскажите пожалуйста. перегрузка оператора выглядит: void operator # (int i) В...

Перегрузка "operator ="
Не пойму чего возвращать из operator и так и так кручусь, умом не дохожу, помогите пожалуйста ...

Перегрузка "operator +"
Прив, подскажите, как организовать перегрузку, чтобы работало, как надо. У меня такая проблема ...

11
Заблокирован
02.09.2011, 16:20 2
покажи чё ты хочешь, код
0
Каратель
Эксперт С++
6601 / 4020 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
02.09.2011, 16:23 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;
}
0
24 / 16 / 3
Регистрация: 19.12.2009
Сообщений: 366
02.09.2011, 16:27  [ТС] 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;
}
спасибо, но я знаю это решение о неявном преобразование, мне важно именно ответ на вопрос мой.
0
Заблокирован
02.09.2011, 16:29 5
Цитата Сообщение от List2006 Посмотреть сообщение
для вопроса 1 код не нужен, мне нужно знать допускается или нет.
да, допускается
на второй скидывай код не самому же писать
0
24 / 16 / 3
Регистрация: 19.12.2009
Сообщений: 366
02.09.2011, 16:50  [ТС] 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 секунд
Меняешь "=" на "<<" и все норм, а тут ошибка.
0
Заблокирован
02.09.2011, 16:54 7
извиняюсь, я чё то == прочитал

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

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

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

Добавлено через 2 минуты
тогда всё правильно твой компилятор говорит
А как это понять? Он делает эту функцию статической? Но по определению статическая может обращаться только к статическим данным же?
0
Заблокирован
02.09.2011, 16:58 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.
0
24 / 16 / 3
Регистрация: 19.12.2009
Сообщений: 366
02.09.2011, 16:59  [ТС] 10
или он делает статическое все то что нельзя перезагружать (отсюда и паника компилятора)?
0
Заблокирован
02.09.2011, 17:03 11
Цитата Сообщение от List2006 Посмотреть сообщение
Он делает эту функцию статической
Цитата Сообщение от LosAngeles Посмотреть сообщение
non-static member function with exactly one parameter
understand?

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

Добавлено через 1 минуту
Цитата Сообщение от List2006 Посмотреть сообщение
Может кто пруф кинуть где есть нечто типа таблицы - "что и как можно перегружать"?
13.5 Overloaded operators
довольно хорошо всё расписано)
0
24 / 16 / 3
Регистрация: 19.12.2009
Сообщений: 366
02.09.2011, 17:08  [ТС] 12
все, понял, что вне main у нас же статическая "память"

Добавлено через 4 минуты
мне кажется причина как раз не в этом (не в случаи когда перезагрузка идет в методе), просто если внешне так написать и какой нибудь объект к другому присваивается то, это может вызвать неопределенные состояния (что делать - преобразовывать правый объект, или вызвать у него операцию присвоения, но и у левого объекта уже есть операция присвоения).
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.09.2011, 17:08

Перегрузка "operator ++"
Всем доброго времени суток. Вот сделал перегрузку оператора ++ TAvia TAvia::operator++() { ...

Уменьшение значений элементов матрицы(перегрузка операции "--")
Задача Перегрузите операцию &quot;--&quot; позволяющую уменьшать переменную типа матрица на 1. В...

Перегрузка операции "*" для умножения одномерных массивов
Нужна помощь. Есть условие задачи: Выполните перегрузку операции &quot;*&quot; для умножения одномерных...

Классы: перегрузка операции "Бинарный +"
Помогите пожалуйста реализовать перегрузку операции бинарный+:добавляет к значению поля amount...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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