C ++ Допустимый указатель на функцию равен нулю

0

У меня в основном есть класс, который принимает указатель на функцию в своем конструкторе, а затем сохраняет его в переменной, которая будет использоваться при вызове функции в классе, например:

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

РЕШИТЬ

  • 1
    Код, похоже, должен работать. Пожалуйста, покажите примеры того, как вы создаете и используете объекты foo .
  • 0
    все функции, объявленные в заголовках
Показать ещё 7 комментариев
Теги:
function-pointers

1 ответ

1

По мнению класса, кажется, что вы никогда не захотите построить "foo" с помощью указателя на нуль. Вы считали, что выбрали исключение в конструкторе, если указатель функции равен нулю? Это может помочь вам определить местоположение в коде, где "foo" создается с использованием нулевого указателя.

  • 0
    Я обнаружил ошибку в цикле for, который создает foo-объекты: он слишком рано остановил одну итерацию. Спасибо за все ответы, проблема была решена.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню