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

С какой стороны функция - C++

Восстановить пароль Регистрация
 
Lordif
 Аватар для Lordif
21 / 21 / 1
Регистрация: 18.04.2010
Сообщений: 87
27.05.2012, 22:50     С какой стороны функция #1
Перегрузил оператор:
C++
1
2
3
4
template<typename _My> _My& List<_My>::Iter::operator *() const
{
    return *_Tptr;
}
Можно ли как-нибудь узнать с какой стороны от знака равенства стоит эта функция?
Пробовал перегрузить таким образом:
C++
1
2
3
4
5
6
7
8
template<typename _My> _My& List<_My>::Iter::operator *() const
{
    return *_Tptr;
}
template<typename _My> _My List<_My>::Iter::operator *() const
{
    return *_Tptr;
}
Но компилятор ругается.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
27.05.2012, 23:48     С какой стороны функция #2
Текущий объект(this) обычно стоит слева от оператора а тот что справа(если он есть) передается как параметр (т.е указывается в скобках)
Lordif
 Аватар для Lordif
21 / 21 / 1
Регистрация: 18.04.2010
Сообщений: 87
28.05.2012, 07:21  [ТС]     С какой стороны функция #3
Дополню. Мне необходимо различить такие ситуации:
C++
1
2
*а = 5;
b = *a
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
28.05.2012, 09:00     С какой стороны функция #4
Цитата Сообщение от Lordif Посмотреть сообщение
Дополню.
Если тебе нужно различать эти ситуации, то ты просто не правильно их используешь.

Допустимы два варианта этой перегрузки:

C++
1
2
3
4
5
6
7
8
9
10
11
template<typename _My>
const _My& List<_My>::Iter::operator *() const
{
    return *_Tptr;
}
 
template<typename _My>
_My & List<_My>::Iter::operator *()
{
    return *_Tptr;
}
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
28.05.2012, 17:20     С какой стороны функция #5
Вариант с const как я понимаю для b = *a ?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
28.05.2012, 17:53     С какой стороны функция #6
да
(всякие символы)
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
28.05.2012, 18:05     С какой стороны функция #7
Чет не пойму что не то...

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
33
using namespace std;
 
struct A
 {
   const A& operator *() const;
         A& operator *();
 };
//-----------------------------------
const A&   A::operator *() const
{
 cout<<"first"<<endl;
 return *this;
}
//-----------------------------------
A& A::operator *()
{
 cout<<"second"<<endl;
 return *this;
}
//-----------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
system("chcp 1251");
 
A a,b;
 
*a = b;
b = *a;
 
system("pause");
return 0;
}
//---------------------------------------------------------------------------
Так только второе выводит..

Добавлено через 58 секунд
http://codepad.org/PIQJdtpz
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
28.05.2012, 18:20     С какой стороны функция #8
Это уже выпендрёж оптимизирующего компилятора.

Попробуй нормальную реализацию написать когда возвращается ссылка не на себя, а на данные.
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
28.05.2012, 18:29     С какой стороны функция #9
Так?
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
33
34
35
using namespace std;
 
struct A
 {
  int data;
   const int& operator *() const;
         int& operator *();
 };
//-----------------------------------
const int&   A::operator *() const
{
 cout<<"first"<<endl;
 return data;
}
//-----------------------------------
int& A::operator *()
{
 cout<<"second"<<endl;
 return data;
}
//-----------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
system("chcp 1251");
 
A a;
int b;
 
*a = 5;
b = *a;
 
system("pause");
return 0;
}
//---------------------------------------------------------------------------
Тот же результат http://codepad.org/JjMVui5L
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
28.05.2012, 18:43     С какой стороны функция #10
На сколько мне известно, если перегружена функция как const, то const-версия используется только для const-объектов.

Добавлено через 7 минут
Немного не так сформулировал. const-объекты не могут вызывать не-const функции. Для не-const же объектов если нет перегрузки функции, которая объявлена как const, то используется она, иначе используется не-const версия функции.
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
28.05.2012, 18:47     С какой стороны функция #11
если перегружена функция как const, то const-версия используется только для const-объектов.
Чет не догнал про что речь про func()const{} или про const T& func(){}; ?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
28.05.2012, 18:56     С какой стороны функция #12
Ну раз речь про сами функции, а не возвращаемые объекты, то наверно
C++
1
void func() const;
все таки

Добавлено через 7 минут
То есть например есть такой класс:

C++
1
2
3
4
5
6
7
8
9
10
11
class someClass {
  public:
   someClass();
 
   void someFunc() const;
   void someFunc();
   
   void anotherSomeFunc();
 
   void anotherSomeFunc2() const;
};
C++
1
2
3
4
5
6
7
8
9
10
11
someClass someObject;
const someClass anotherSomeObject;
 
someObject.someFunc(); //вызовется не-const версия функции, так как объект не константный
anotherSomeObject.someFunc(); //вызовется const версия функции, так как объект константный
 
someObject.anotherSomeFunc(); //вызовется не-const версия функции, так как объект не константный
anotherSomeObject.anotherSomeFunc(); //ошибка компиляции, нет const версии функции
 
someObject.anotherSomeFunc2(); //вызовется const версия функции, так как нет перегрузки не-const версии функции
anotherSomeObject.anotherSomeFunc2(); //вызовется const версия функции, так как объект константный
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
28.05.2012, 18:56     С какой стороны функция #13
Тобиш предложеный вариант - не вариант...

Toshkarik, уже проверил создав const A -объект
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
28.05.2012, 19:04     С какой стороны функция #14
То есть остаётся такой кривой способ:
C++
1
b = *static_cast<const A>(a);
Бррр...
Lordif
 Аватар для Lordif
21 / 21 / 1
Регистрация: 18.04.2010
Сообщений: 87
28.05.2012, 21:38  [ТС]     С какой стороны функция #15
И никаких других вариантов нет? Может как то окольными путями?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
28.05.2012, 22:00     С какой стороны функция #16
В смысле? А в чем проблема то? Что требуется сделать?
Lordif
 Аватар для Lordif
21 / 21 / 1
Регистрация: 18.04.2010
Сообщений: 87
28.05.2012, 22:20  [ТС]     С какой стороны функция #17
Необходимо различать данные 2 случая.
Но при этом можно использовать их только так:
C++
1
2
*а = 5;
b = *a
Может можно как-то сторонние функции перегрузить или вообще по-другому задачу решить?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
28.05.2012, 22:22     С какой стороны функция #18
Тоже интересно, зачем это?
Но если извращения нас не пугают...
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
 
using namespace std;
 
class A
{
private:
    class proxy
    {
    public:
        proxy(A& a) : a(a) {}
        template <typename T>
        proxy& operator=(T const& rhs)
        {
            a.asterisk() = rhs;
            return *this;
        }
        operator int const&()
        {
            return a.asterisk_const();
        }
    private:
        A& a;
    };
public:
    const int& asterisk_const() const;
    int& asterisk();
    proxy operator*();
private:
    int data;
};
 
const int& A::asterisk_const() const
{
    cout<<"first"<<endl;
    return data;
}
 
int& A::asterisk()
{
    cout<<"second"<<endl;
    return data;
}
 
A::proxy A::operator*()
{
    return A::proxy(*this);
}
 
//-----------------------------------
 
int main(int argc, char* argv[])
{
    A a;
    int b;
 
    *a = 5;
    b = *a;
 
    return 0;
}
Lordif
 Аватар для Lordif
21 / 21 / 1
Регистрация: 18.04.2010
Сообщений: 87
28.05.2012, 22:29  [ТС]     С какой стороны функция #19
Мда, и правда извращение, я понять так сразу не могу как это работает
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2012, 22:36     С какой стороны функция
Еще ссылки по теме:

C++ Найти с какой стороны цикл будет находить 0 скорее и на какой позиции он стоит
Даны три стороны одного и три стороны другого треугольника. Я, чайник нужно в С++ C++
C++ По какой-то причине не работает функция

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

Или воспользуйтесь поиском по форуму:
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
28.05.2012, 22:36     С какой стороны функция #20
Вы все пытаетесь понять как работает перегрузка операторов? Точно так же как и функции, когда компилятор встречает запись вида A = B;
он подставляет в это место вызов функции.
C++
1
A.operator=( B );
которую Вы так же можете вызвать вручную. И так со всеми перегрузками операторов.
Yandex
Объявления
28.05.2012, 22:36     С какой стороны функция
Ответ Создать тему

Метки
прокси объект
Опции темы

Текущее время: 11:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru