powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / указатель на функции внутри классе C++
23 сообщений из 23, страница 1 из 1
указатель на функции внутри классе C++
    #39076983
gera3323
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
указатель на функции внутри классе C++
    #39076991
gera3323
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gera3323,

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

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


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

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

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

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

что бы функции в результате были перегружены
...
Рейтинг: 0 / 0
указатель на функции внутри классе C++
    #39077004
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravесли метод не виртуальный
Нет разницы.
...
Рейтинг: 0 / 0
указатель на функции внутри классе C++
    #39077005
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
указатель на функции внутри классе C++
    #39077009
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskypetravесли метод не виртуальный
Нет разницы.
Есть. Если указатель будет на объект класса наследника, а метод не виртуальный, но переопределённый... То хорошего результата мы не добьёмся. Может, я просто непонятно выразился.
...
Рейтинг: 0 / 0
указатель на функции внутри классе C++
    #39077014
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravСмысл в том, что метод класса нельзя вызвать без указания объекта (указателя или ссылки) этого класса.
Даже так:
petravСмысл в том, что метод класса нельзя вызвать без указания объекта (указателя на объект, или ссылки на объект, или самого объекта) этого класса.
...
Рейтинг: 0 / 0
указатель на функции внутри классе C++
    #39077016
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,

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

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

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

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

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

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

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

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

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

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

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


Это существенно усложняет парсер, потому что в том контексте по текущим правилам не допускаются типы, а только значения.
И ради того чтобы сэкономить вам пару символов в исходнике никто не будет усложнять компиляторы.
...
Рейтинг: 0 / 0
указатель на функции внутри классе C++
    #39077043
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
указатель на функции внутри классе C++
    #39077071
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravПоясните, если не затруднит. Не понял. Про типы и значения.
Внутри () ожидается выражение. А вы хотите чтобы там иногда в зависимости от контекста были объявления аргументов. Это усложняет парсер.

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

Вот так - нормально. Не сотрете клавиши ))
Код: plaintext
1.
auto mp = static_cast<void (Foo::*)(int)>(&Foo::doThis);;
...
Рейтинг: 0 / 0
указатель на функции внутри классе C++
    #39077769
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
никто не сказал про std::bind и std::function ?
...
Рейтинг: 0 / 0
указатель на функции внутри классе C++
    #39078002
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_blackникто не сказал про std::bind и std::function ?
Не работают с перегруженным функциями
...
Рейтинг: 0 / 0
указатель на функции внутри классе C++
    #39078028
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При желании всегда можно изобразить что-то
вроде такого
Код: 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
указатель на функции внутри классе C++
    #39078031
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wstПри желании всегда можно изобразить что-то
Судя по всему вы не читали предыдущие сообщения ))
...
Рейтинг: 0 / 0
указатель на функции внутри классе C++
    #39078040
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
указатель на функции внутри классе C++
    #39078203
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gera3323,

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


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