У меня в основном есть класс, который принимает указатель на функцию в своем конструкторе, а затем сохраняет его в переменной, которая будет использоваться при вызове функции в классе, например:
class foo{
public:
foo( void(*a)() = 0 ): func(a){}
void call(){ if(func) func(); }
private:
void(*func)(); };
Проблема возникает, когда я создаю экземпляр с функцией, которая была объявлена вперед в включенном заголовке. По отладке я обнаружил, что функция-указатель иногда имеет значение null, а переданная функция действительна, в результате чего она не выполняется.
Я использую CodeBlocks с MinGW.
Ну вот так:
function.h
void test();
function.cpp
#include "function.h"
void test(){
std::cout << "Hello World" << std::endl;}
main.cpp
#include "function.h"
int main(){
foo a(test);
a.call();
return 0;}
Еще одно: это не всегда происходит неправильно, поэтому я думаю, что это связано с оптимизацией или чем-то подобным.
Некоторые вещи, которые я забыл, потому что они не должны иметь значения, это то, что экземпляр foo создается с помощью нового, добавленного в std :: vector и удаляющегося в конце функции call(). Деструктор гарантирует, что он также удаляется из std :: vector. Все это происходит в другом файле cpp, который также включает функцию.h
РЕШИТЬ
По мнению класса, кажется, что вы никогда не захотите построить "foo" с помощью указателя на нуль. Вы считали, что выбрали исключение в конструкторе, если указатель функции равен нулю? Это может помочь вам определить местоположение в коде, где "foo" создается с использованием нулевого указателя.
foo
.