Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / указатель на функции внутри классе C++ / 23 сообщений из 23, страница 1 из 1
14.10.2015, 21:42:31
    #39076983
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
class CControl_console
{

     typedef void (CControl_console::*pfun3)( );

     pfun3 _class3;

    public:
        CControl_console( void ) 
        {

	    _class3 =  &CControl_console::Start;

           _class3(); // вот здесь ругается. error C2064: результатом вычисления фрагмента не является функция, принимающая 0 аргументов
       }

        void Start( )
        {

        }
};
...
Рейтинг: 0 / 0
14.10.2015, 21:51:22
    #39076991
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
gera3323,

сделал так (this->*_class3)();
...
Рейтинг: 0 / 0
14.10.2015, 21:54:14
    #39076993
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
gera3323gera3323,

сделал так (this->*_class3)();
Или так:
Код: plaintext
1.
           (*this.*_class3)();


Смысл в том, что метод класса нельзя вызвать без указания объекта (указателя или ссылки) этого класса. Вместо this можно подставить другой указатель (на другой объект того же класса, если метод не виртуальный).
...
Рейтинг: 0 / 0
14.10.2015, 21:57:43
    #39076996
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
petrav,

спасибо за вариант.

а можно как-нибудь сделать вот так ?

void(CControl_console::*pfun1)( );
void(CControl_console::*pfun1)( std::string );

что бы функции в результате были перегружены
...
Рейтинг: 0 / 0
14.10.2015, 22:07:17
    #39077004
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
petravесли метод не виртуальный
Нет разницы.
...
Рейтинг: 0 / 0
14.10.2015, 22:07:25
    #39077005
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
gera3323petrav,

спасибо за вариант.

а можно как-нибудь сделать вот так ?

void(CControl_console::*pfun1)( );
void(CControl_console::*pfun1)( std::string );

что бы функции в результате были перегружены
Да. Главное пойми, что вместо this можно использовать указатель на другой объект, не только this.
Код: plaintext
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.
class CControl_console
{

     typedef void (CControl_console::*pfun3)( );
     typedef void (CControl_console::*pfun4)( std::string );

     pfun3 _class3;
     pfun4 _class4;

    public:
        CControl_console( void ) 
        {

            _class3 =  &CControl_console::Start;
            _class4 =  &CControl_console::Start;

           (this->*_class3)();
           (this->*_class4)( "Можно." );
       }

        void Start( )
        {
        }
        void Start( std::string )
        {
        }
};
...
Рейтинг: 0 / 0
14.10.2015, 22:10:43
    #39077009
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
Anatoly Moskovskypetravесли метод не виртуальный
Нет разницы.
Есть. Если указатель будет на объект класса наследника, а метод не виртуальный, но переопределённый... То хорошего результата мы не добьёмся. Может, я просто непонятно выразился.
...
Рейтинг: 0 / 0
14.10.2015, 22:15:42
    #39077014
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
petravСмысл в том, что метод класса нельзя вызвать без указания объекта (указателя или ссылки) этого класса.
Даже так:
petravСмысл в том, что метод класса нельзя вызвать без указания объекта (указателя на объект, или ссылки на объект, или самого объекта) этого класса.
...
Рейтинг: 0 / 0
14.10.2015, 22:17:17
    #39077016
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
petrav,

Эта проблема не имеет отношения к указателям на методы.
Если просто по указателю на предок вызвать не виртуальный метод, который переопределен в наследнике, то будет точно такой же эффект.

Поэтому без разницы, с какими методами вы работаете через указатели. Все будет работать также как и без указателей (либо работать либо нет).
...
Рейтинг: 0 / 0
14.10.2015, 22:21:00
    #39077017
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
Anatoly Moskovskypetrav,

Эта проблема не имеет отношения к указателям на методы.
Если просто по указателю на предок вызвать не виртуальный метод, который переопределен в наследнике, то будет точно такой же эффект.

Поэтому без разницы, с какими методами вы работаете через указатели. Все будет работать также как и без указателей (либо работать либо нет).
Ну это само собой. :) Но мы же в контексте указателей на методы говорили. Я не стал расширяться на целую лекцию.
...
Рейтинг: 0 / 0
14.10.2015, 22:32:38
    #39077021
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
Anatoly Moskovsky,

Как по вашему, почему при взятии адреса метода нельзя явно указывать сигнатуру метода? Я ту недавно столкнулся с проблемами: 18219078 . И auto у нас отпадает.

PS: Насчет свободных-перегруженных функций не помню, но думаю там так же.
...
Рейтинг: 0 / 0
14.10.2015, 22:47:40
    #39077031
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
petravКак по вашему, почему при взятии адреса метода нельзя явно указывать сигнатуру метода? Я ту недавно столкнулся с проблемами: 18219078 . И auto у нас отпадает.

PS: Насчет свободных-перегруженных функций не помню, но думаю там так же.
Можно, но только если конкретную перегрузку можно вывести из типа приемника указателя.
А как вы хотели иначе?
...
Рейтинг: 0 / 0
14.10.2015, 22:49:02
    #39077032
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
...
Рейтинг: 0 / 0
14.10.2015, 22:52:41
    #39077035
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
Anatoly MoskovskypetravКак по вашему, почему при взятии адреса метода нельзя явно указывать сигнатуру метода? Я ту недавно столкнулся с проблемами: 18219078 . И auto у нас отпадает.

PS: Насчет свободных-перегруженных функций не помню, но думаю там так же.
Можно, но только если конкретную перегрузку можно вывести из типа приемника указателя.
В этом и проблема.

Anatoly MoskovskyА как вы хотели иначе?
Вот так:

Код: plaintext
1.
auto mp = &Foo::doThis(int); // Правая часть полностью определяет тип результата, как обычно, но не в этом случае.
...
Рейтинг: 0 / 0
14.10.2015, 22:58:44
    #39077039
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
petravВот так:

Код: plaintext
1.
auto mp = &Foo::doThis(int); // Правая часть полностью определяет тип результата, как обычно, но не в этом случае.


Это существенно усложняет парсер, потому что в том контексте по текущим правилам не допускаются типы, а только значения.
И ради того чтобы сэкономить вам пару символов в исходнике никто не будет усложнять компиляторы.
...
Рейтинг: 0 / 0
14.10.2015, 23:21:01
    #39077043
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
Anatoly MoskovskypetravВот так:

Код: plaintext
1.
auto mp = &Foo::doThis(int); // Правая часть полностью определяет тип результата, как обычно, но не в этом случае.


Это существенно усложняет парсер, потому что в том контексте по текущим правилам не допускаются типы, а только значения.
Поясните, если не затруднит. Не понял. Про типы и значения.

Anatoly MoskovskyИ ради того чтобы сэкономить вам пару символов в исходнике никто не будет усложнять компиляторы.
Это не пара символов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// Предлагаемый синтаксис.
auto mp = &Foo::doThis(int);

// В реальности.
auto mp = static_cast<void (Foo::*)(int)>(&Foo::doThis);

// Ну ладно, без static_cast.
auto mp = (void (Foo::*)(int))(&Foo::doThis);


Я ж тут auto не просто так пишу. Это мог бы быть параметр шаблона, а не auto. Там по ссылке всё видно.

И уж где там усложнение парсера, если я в предлагаемом синтаксисе явно указываю перегруженный метод? Прямо тыкаю в него! Упрощение жеж! :)
...
Рейтинг: 0 / 0
15.10.2015, 02:29:22
    #39077071
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
petravПоясните, если не затруднит. Не понял. Про типы и значения.
Внутри () ожидается выражение. А вы хотите чтобы там иногда в зависимости от контекста были объявления аргументов. Это усложняет парсер.

petravЭто не пара символов:
Я не имел в виду буквально ))

Вот так - нормально. Не сотрете клавиши ))
Код: plaintext
1.
auto mp = static_cast<void (Foo::*)(int)>(&Foo::doThis);;
...
Рейтинг: 0 / 0
15.10.2015, 15:34:11
    #39077769
alexy_black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
никто не сказал про std::bind и std::function ?
...
Рейтинг: 0 / 0
15.10.2015, 18:43:23
    #39078002
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
alexy_blackникто не сказал про std::bind и std::function ?
Не работают с перегруженным функциями
...
Рейтинг: 0 / 0
15.10.2015, 19:28:11
    #39078028
wst
wst
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
При желании всегда можно изобразить что-то
вроде такого
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include <stdio.h>                                                        
#include <functional>                                                     
struct S {                                                                
  int x;                                                                  
  void f() { printf("%s, x = %d, %p\n", __PRETTY_FUNCTION__, x, this); }  
  void f(int i) {                                                         
    printf("%s, x = %d, %p, %d\n", __PRETTY_FUNCTION__, x, this, i);      
  }                                                                       
};                                                                        
int main() {                                                              
  std::function<void(S *)> f1 = static_cast<void (S::*)()>(&S::f);        
  std::function<void(S *, int)> f2 = static_cast<void (S::*)(int)>(&S::f);
  std::function<void(S &)> f3 = [](S &s) {                                
    s.f();                                                                
    s.f(10000);                                                           
  };                                                                      
  std::function<void(S &, int)> f4 = [](S &s, int x) { s.f(x); };         
  S s1{321}, s2{567};                                                     
  f1(&s1);                                                                
  f2(&s2, 123);                                                           
  f3(s1);                                                                 
  f4(s2, 123);                                                            
}                                                                         

...
Рейтинг: 0 / 0
15.10.2015, 19:29:32
    #39078031
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
wstПри желании всегда можно изобразить что-то
Судя по всему вы не читали предыдущие сообщения ))
...
Рейтинг: 0 / 0
15.10.2015, 19:43:20
    #39078040
wst
wst
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
Anatoly Moskovskywst...
Судя по всему вы не читали предыдущие сообщения ))
Если в первую очередь отталкиваться от исходного сообщения, а именно строк
Код: plaintext
1.
2.
3.
	    _class3 =  &CControl_console::Start;

           _class3(); // вот здесь ругается. error C2064: результатом вычисления фрагмента не является функция, принимающая 0 аргументов


то вариант с
Код: plaintext
1.
2.
std::function<void(CControl_console&)> f=[&](CControl_console& self){self.Start();}
f(*this);

вполне сойдет за выход.
А сэкономить краску на клавиатуре можно натыкав потом в f замыканий.
...
Рейтинг: 0 / 0
16.10.2015, 06:42:16
    #39078203
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на функции внутри классе C++
gera3323,

непонятно что тебе нужно, если косметика, то просто перегрузи оператор "()" и будет тебе типа функция
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / указатель на функции внутри классе C++ / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]