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

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

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

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

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

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

2) Компилятор (mingw) при попытки объявить перегрузку внешней функции - ругается что функция должна быть не статичной? Хотелось бы понять контекст этого ошибки, то есть функция "operator=" определяется как статическая?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.09.2011, 16:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка внешней функции операции "operator=" (C++):

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

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

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

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

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

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

11
LosAngeles
Заблокирован
02.09.2011, 16:20 #2
покажи чё ты хочешь, код
0
Jupiter
Каратель
Эксперт С++
6564 / 3985 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
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
List2006
24 / 16 / 2
Регистрация: 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
LosAngeles
Заблокирован
02.09.2011, 16:29 #5
Цитата Сообщение от List2006 Посмотреть сообщение
для вопроса 1 код не нужен, мне нужно знать допускается или нет.
да, допускается
на второй скидывай код не самому же писать
0
List2006
24 / 16 / 2
Регистрация: 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
LosAngeles
Заблокирован
02.09.2011, 16:54 #7
извиняюсь, я чё то == прочитал

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

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

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

Добавлено через 2 минуты
тогда всё правильно твой компилятор говорит
А как это понять? Он делает эту функцию статической? Но по определению статическая может обращаться только к статическим данным же?
0
LosAngeles
Заблокирован
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
List2006
24 / 16 / 2
Регистрация: 19.12.2009
Сообщений: 366
02.09.2011, 16:59  [ТС] #10
или он делает статическое все то что нельзя перезагружать (отсюда и паника компилятора)?
0
LosAngeles
Заблокирован
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
List2006
24 / 16 / 2
Регистрация: 19.12.2009
Сообщений: 366
02.09.2011, 17:08  [ТС] #12
все, понял, что вне main у нас же статическая "память"

Добавлено через 4 минуты
мне кажется причина как раз не в этом (не в случаи когда перезагрузка идет в методе), просто если внешне так написать и какой нибудь объект к другому присваивается то, это может вызвать неопределенные состояния (что делать - преобразовывать правый объект, или вызвать у него операцию присвоения, но и у левого объекта уже есть операция присвоения).
0
02.09.2011, 17:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2011, 17:08
Привет! Вот еще темы с ответами:

Конструктор копирования и перегрузка операции "=" - C++
Привет всем, я не понимаю для чего конструктор копирования и перегрузку операции присваивания необходимо использовать в паре, Не пойму в...

Перегрузка операции "%=" глобальной фунцкцией - C++
Здравствуйте, я тут, решая задачу на перегрузку оператора при помощи глобальной функции наткнулся на такую проблему: Есть класс op, в нем...

Классы: перегрузка операции "Бинарный +" - C++
Помогите пожалуйста реализовать перегрузку операции бинарный+:добавляет к значению поля amount значения скаляра #include &lt;iostream&gt; ...

Перегрузка операции "=", где ошибка? - C++
В чем ошибка перезагрузки операции &quot;=&quot; ? нужно поменять структуры содержимым полей. вот код: #include &lt;iostream&gt; #include...


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

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

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