Как получить доступ к члену класса и методам из статического метода (обработчик сигналов)

У меня есть одна проблема. Я пишу свою программу на языке C++. У меня есть одна проблема. Мне нужно установить обработчик сигнала для моего процесса. Поскольку сигнал связан с процессом на системном уровне, я столкнулся с проблемой.
Моя программа состоит из нескольких классов. Они связаны вместе. Но в данном случае это не имеет значения.
Проблема в том, что мне нужен доступ к членам и методам класса из моего обработчика сигналов. Например, у меня есть класс с именем Foo, у него есть некоторые члены и методы.
Итак, из моего обработчика мне нужно вызвать его функцию и изменить члены.
Я понимаю, что компилятор должен знать, что экземпляры этого класса будут существовать во время все выполнение программы.
Я попытался установить экземпляр Foo статического класса-члена в другой класс, но это не решило проблему.
Я понятия не имею, как правильно это сделать. Объясните, пожалуйста, как правильно реализовать обработку сигналов в таком случае.

Вот пример моего кода:

    class MyContainer
    {
    private:
        std::vector<Foo> container;
    public:
        int removeFromContainer(Foo* aFoo) { 
        // DO some stuff 
return RESULT_CODE;
}
 int addToContainer(Foo* aFoo) { 
        // DO some stuff 
        return RESULT_CODE;
        }
    };

Вот мой основной класс

class MainClass
{
private:
    int member;
public:
    void mainLoop(char* args) { 
      signal(SIGCHLD, &signalHandler);
 }
};

Вот моя функция для обработки сигналов

  void static signalHandler_child(int p)
      {
           this->myContainerInstance->addToContainer(new Foo);

      }

person braohaufngec    schedule 04.12.2014    source источник


Ответы (1)


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

Что-то вроде этого

class Foo
{
private:
    int member;
public:
    static int Handler(Foo* aFoo) { return aFoo->member; }
};
person Marco Veglio    schedule 04.12.2014