с++ Вызов функции через указатель

134
27 января 2021, 14:40

Прошу сначала ознакомиться с кодом:

Bar.h:

namespace Foo{
    struct Bar {
        private:
            void MasterUpdate();
            void SlaveUpdate();
        public:
            typedef void (Bar::*pUpdate)();
            Bar(bool master);
            pUpdate Update();
    }
}

Bar.cpp

void Bar::MasterUpdate(){
    // код...
}
void Bar::SlaveUpdate(){
    // код...
}
void Bar::Bar() {
    if(master) {
        Update = &Bar::MasterUpdate;
    } else {
        Update = &Bar::SlaveUpdate;
    }
}

main.cpp

#include <Bar.h>
Foo::Bar* bar;
int main() {
    bar = new Foo::Bar(true);
    while (1) {
        // вызов bar->Update();
    }
}

1) вызов bar->Update(); приводит к ошибке:

error: must use '.*' or '->*' to call pointer-to-member function in 'bar->Foo::Bar::Update (...)', e.g. '(... ->* bar->Foo::Bar::Update) (...)'`

2) Ошибка говорит заменить -> на ->* заменяем: bar->*Update(); - получаем ошибку:

error: 'Update' was not declared in this scope
         modbusRtu->*Update()
                            ^

3) Поискав в интернете нашёл, что вызов должен быть таким: (bar->*Update)();. Пробуем и получаем ошибку похожую на предыдущую. error: 'Update' was not declared in this scope (modbusRtu->*Update)() ^

Так вот, как вызвать Update у объекта bar?

Answer 1
#include <iostream>
#include <functional>
namespace Foo{
    struct Bar {
        private:
            void MasterUpdate()
            {
                std::cout << __FUNCTION__ "\n";
            }
            void SlaveUpdate()
            {
                std::cout << __FUNCTION__ "\n";
            }
        public:
            typedef void (Bar::*pUpdate)();
            Bar(bool master)
            {
                if(master) {
                    Update = &Bar::MasterUpdate;
                } else {
                    Update = &Bar::SlaveUpdate;
                }
            }
            pUpdate Update;
    };
}
int main() {
    {
        Foo::Bar bar(true);
        std::invoke(bar.Update, bar);
    }
    {
        Foo::Bar bar(false);
        std::invoke(bar.Update, bar);
    }
    return 0;
}

Вывод:

 Foo::Bar::MasterUpdate
 Foo::Bar::SlaveUpdate
READ ALSO
Как писать приложения для андроид на c++?

Как писать приложения для андроид на c++?

Можно ли вообще написать код на c++ а потом скомпилировать вapk

107
Как изменить GDB в CLion?

Как изменить GDB в CLion?

Написал код под AVR (atmega8p), скомпилировал в elf и hex файлыПри нажатии кнопки debug выдаёт сообщение:

183
Настройка границ ячеек у QTableWidget

Настройка границ ячеек у QTableWidget

Есть ли возможность в QTableWidget определенным ячейкам задавать свой стиль отображения границ? Некоторые группы ячеек в моей таблице содержат...

96
ошибка: cannot convert ‘std::__cxx11::string {aka std::__cxx11::basic_string&lt;char&gt;}’ to ‘const char*’

ошибка: cannot convert ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ to ‘const char*’

в общем в opengl пытаюсь вывести текст, в opengl проектеНо почему то выходит какая то синтаксическая ошибка

191