2017-01-24 6 views
-1

В моей main.cpp у меня есть что-то похожее на следующее:Вызов функций неявно из производных классов

void OnEventStart(int id) 
{ 
    // Do some stuff 
} 

Эта функция обратного вызова, он срабатывает только (главным SDK, что это от), когда произошло событие.

теперь у меня есть этот класс:

class SomeClass { 
public: 
    void OnEventStart(int id); 
}; 

void SomeClass::OnEventStart(int id) 
{ 
    // Do some other stuff 
} 

Теперь я хочу, чтобы вызвать void SomeClass::OnEventStart(int id) не делать что-то вроде этого:

SomeClass class; 
void OnEventStart(int id) 
{ 
    // Do some stuff 

    class.OnEventStart(id); 

    // AnotherClass.OnEventStart(id); 
    // Another.OnEventStart(id); 
} 

Как вы можете себе представить, используя метод, как это может легко загромождать внутренняя функция/обратный вызов.

+1

Я предполагаю, что вы хотите, чтобы фреймворк/SDK вы использовали для прямого вызова вашей функции-члена? Тогда это зависит * много * от фактического фреймворка/SDK, который вы используете. Возможно, это даже не возможно. Но мы не можем сказать вам, если вы не сообщите нам об инфраструктуре/SDK и том, как вы ее используете (с помощью [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve)).Также, пожалуйста, [прочитайте о том, как задавать хорошие вопросы] (http://stackoverflow.com/help/how-to-ask). –

+2

imho это поможет понять вопрос, если вы сообщите нам, как вы хотели бы это сделать, а не только как вы этого не хотите – user463035818

ответ

1

Ваш вопрос не очень понятно, но я предположу следующее:

  • Вы какой-то обработчик обратного вызова, который принимает void(*)(int).

В том случае, если SomeClass является лицом без гражданства, вы можете просто использовать лямбда-обертку:

my_framework_callback([]{ SomeClass{}.OnEventStart(id); }); 

Если бы я понял, что вы просили, вот другое предположение:

  • SomeClass и аналогичные виды stateless.

  • Вы раздражены тем, что должны создать экземпляр SomeClass, чтобы назвать один из его методов.

Если это так, то вы можете создать временный экземпляр из SomeClass на месте:

void OnEventStart(int id) 
{ 
    SomeClass{}.OnEventStart(id); 
    AnotherClass{}.OnEventStart(id); 
    Another{}.OnEventStart(id); 
} 

Если ваш вопрос вместо того, чтобы ...

«У меня есть разные классы с одним и тем же интерфейсом, и я хочу вызвать функцию на всех из них «.

... то один из возможных решений было бы с помощью абстрактный базовый класс, который обеспечивает.OnEventStart() = 0 и хранить std::vector указателей базового класса.

std::vector<std::unique_ptr<MyAbstractClass>> handlers; 
void OnEventStart(int id) 
{ 
    for(auto& h : handlers) 
     h->OnEventStart(id); 
} 
+0

Спасибо за ответ. Извините, что вопрос непонятен, проблема, с которой я столкнулся во второй части вашего сообщения. Разве этот метод не потребовал бы, чтобы я создавал экземпляр каждого класса (которого будет много), а затем переходим к 'handlers.push_back (class)' для каждого отдельного класса? – thefatshizms

+0

@thefatshizms: вы можете сделать это по-разному. Если вы знаете все типы во время компиляции, вы можете использовать библиотеку метапрограммирования и список времени компиляции. Если вы разрешаете пользователям вашего кода добавлять больше типов, которые удовлетворяют интерфейсу, вам нужно сделать то, что вы упомянули, возможно, предоставив какую-то функцию 'register ()'. –

 Смежные вопросы

  • Нет связанных вопросов^_^