LINUX.ORG.RU

c++ Передать метод одного класса в качестве параметра для метода другого кдасса

 ,


0

2

Здравствуйте. C++ . Есть две переменные, одна класса А, вторая класса B. Как бы передать нестатический метод 1 первого объекта в нестатический метод 2 второго объекта в качестве калбэк функции. При этом данная калбэк функция должна иметь доступ к членам своего объекта через this.
Пожалуйста, не отсылайте к гуглу. Перечитал несколько руководств, пока не получается.

★★★★★

Последнее исправление: rumgot (всего исправлений: 1)

лямбда, std::function (std::bind)

ossa ★★
()
#include <iostream>
#include <functional>
using std::cout;

class A {
public:
    void foo() { cout << "A::foo()\n"; }
};

class B {
public:
    using Cb = std::function<void(void)>;
    void go(Cb cb) {
        // some work

        cb();
    }
};

int main()
{
    A a;
    B b;

    b.go([&a]() {
        a.foo();
    });
}
anonymous
()
Ответ на: комментарий от udhv

не надо так делать

+1

rumgot
Касскажи свой кейс, скорее всего это нужно длелать по-другому.

Kroz ★★★★★
()

Или указатель на член или универсальное решение в духе std::function + лямбда/std::bind.

anonymous
()
Ответ на: комментарий от Kroz

Как существование private/protected влияет на возможность передать в метод колбек?

При этом данная калбэк функция должна иметь доступ к членам своего объекта через this.

Как это нарушает private/protected?

anonymous
()
Ответ на: комментарий от Kroz

Колбэки существовали и использовались всегда, никакого отношения к private/protected они не имеют.

Gvidon ★★★★
()

какой стандарт? Если до 11, то гугли fastdelegate, если после, то есть стандартные средства для этого.

gavlig ★★★
()
Ответ на: комментарий от AF

Указатели на члены не содержат в себе объект, его придётся прокидывать отдельно, что не очень удобно.

Gvidon ★★★★
()

boost::bind на стороне передающего коллбэк, boost::function на стороне получающего коллбэк

Manhunt ★★★★★
()
Ответ на: комментарий от Gvidon

Методу класса, если он конечно не статический, полюбому нужен обьект. И как ты его не прячь за синтаксическим сахаром, суть от этого не поменяется!

AF ★★★
()
Ответ на: комментарий от AF

И пишешь ты, наверное, в бинарных кодах. А чё, всё остальное — это синтаксический сахар, не меняющий сути.

Gvidon ★★★★
()

Твоя задача решаема, но как тебе уже сказали, скорее всего, тебе нужно что-то другое.

Callback-и в C++ оказываются востребованы либо для связи с «необъектным» кодом, либо при кривой архитектуре. Подозреваю, что класс A может реализовать интерфейс I, и вот указатель на него можно передать в B.

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

Callback-и в C++ оказываются востребованы либо для связи с «необъектным» кодом, либо при кривой архитектуре.

Функторы, которые предлагается передавать в алгоритмы STL, как раз являют собой пример таких коллбэков. STL, может быть, и «необъектный», но вполне себе C++-ный.

Manhunt ★★★★★
()
Ответ на: комментарий от AF

Методу класса, если он конечно не статический, полюбому нужен обьект. И как ты его не прячь за синтаксическим сахаром, суть от этого не поменяется!

За то поменяется объем портянки. Доля букв, посвященных бойлерплейту — сократится, а доля букв, посвященных смыслу вещей — возрастёт.

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 1)

Как бы передать нестатический метод 1 первого объекта в нестатический метод 2 второго объекта в качестве калбэк функции

Ты хочешь неправильно.

no-such-file ★★★★★
()
Ответ на: комментарий от Manhunt

Что хорошо опытному девелоперу на практике, то не всегда хорошо новичку в учении. ТС явно новичек и явно учится. Вот пусть и изучает основы, как все это работает.

AF ★★★
()
Ответ на: комментарий от Kiborg

У Саттера были специально расписаны N-способов абузинга прав доступа с целью АЦЦКОГО ХОХОТА к членам класса http://www.gotw.ca/gotw/076.htm чтоб научить всех плохому типа как делать низязя. Еще причудливые люди, узнав про форварды с имплами, любят делать ссылки на экземпляр фасада из импла (потому что отказаться от имплов уже не могут) и прочие атататы :) А потом они открывают для себя Александреску...

slackwarrior ★★★★★
()
Ответ на: комментарий от hobbit

Callback-и в C++ оказываются востребованы либо для связи с «необъектным» кодом, либо при кривой архитектуре.

Совершенно необязательно. Очень часто бывают ситуации, когда сущность определяет, что произошло некоторое событие, но понятия не имеет что с ним дальше делать. В таких случаях удобно делегировать приняние решения какой-нибудь другой сущности (которая не всегда известна первой). Классический пример - кнопка пользовательского интерфейса. Может определить факт того, что ее нажали, но совершенно не знает, как и кто должен обрабатывать это событие. Можно конечно попробовать обмазаться паттерном «наблюдатель» или решать вопрос через наследование, но оба варианта ведут к чудовищной архитектуре. Гораздо правильнее тут использовать какой-нибудь другой callback-механизм (лично мне больше нравися концепция сигналов).

m0rph ★★★★★
()
Последнее исправление: m0rph (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.