Мне нужно навести мост между двумя частями программного обеспечения, но я столкнулся с проблемой, с которой не знаю, как решить. Надеюсь, у кого-то появятся интересные и (желательно) рабочие предложения.
Вот предыстория: у меня есть программный пакет C ++. Мне нужно заменить некоторую функцию в данном классе другой функцией, и это нормально. Проблема в том, что новая функция вызывает другую функцию, которая должна быть статической, но должна иметь дело с членами класса. Это вторая функция, которая меня бесит.
Если функция не является статической, я получаю следующую ошибку:
error: argument of type ‘void (MyClass::)(…)’ does not match ‘void (*)(…)’
Если я устанавливаю ее на статическую, я получаю либо следующую ошибку:
error: cannot call member function ‘void
MyClass::MyFunction(const double *)’ without object
или
error: ‘this’ is unavailable for static member functions
в зависимости от того, использую ли я ключевое слово «this» или нет. («Функция ()» или «это-> Функция ()»).
И, наконец, объекту класса требуются некоторые аргументы, которые я не могу передать статической функции (я не могу изменить прототип статической функции), что не позволяет мне создать новый экземпляр внутри самой статической функции.
Как бы вы справились с таким случаем с минимальным переписыванием?
Редактировать: Хорошо, вот упрощенный пример того, что я должен сделать, надеюсь, что он ясен и верен:
// This function is called by another class on an instance of MyClass
MyClass::BigFunction()
{
…
// Call of a function from an external piece of code,
// which prototype I cannot change
XFunction(fcn, some more args);
…
}
// This function has to be static and I cannot change its prototype,
// for it to be passed to XFunction. XFunction makes iterations on it
// changing parameters (likelihood maximization) which do not appear
// on this sample
void MyClass::fcn(some args, typeN& result)
{
// doesn't work because fcn is static
result = SomeComputation();
// doesn't work, for the same reason
result = this->SomeComputation();
// doesn't work either, because MyClass has many parameters
// which have to be set
MyClass *tmp = new MyClass();
result = tmp->SomeComputation();
}