Другой общий случай, когда можно получить это исключение, включает в себя насмешливые классы во время модульного тестирования. Независимо от используемой насмешливой структуры, вы должны убедиться, что все соответствующие уровни иерархии классов должным образом высмеиваются. В частности, все свойства HttpContext
, на которые ссылается тестируемый код, должны быть изделены.
См. « Исключение NullReferenceException при проверке пользовательского AuthorizationAttribute » для несколько подробного примера.
Следующий класс функций будет соответствовать сигнатуре вашего FuncType:
struct Foo
{
AnotherClass & a_;
Foo(AnotherClass & a) a_(a) {}
double operator()(int i) const
{
return a_.funcAnother(i);
}
};
Измените MyClass :: вычислите шаблон, таким образом:
template<typename FuncType>
void MyClass::compute(FuncType foo)
{
int a=1;
foo(a);
}
Затем вы можете позвонить выполните следующие действия:
void MyClass::run()
{
compute(Foo(*obj_));
}
Если ваш компилятор поддерживает lambdas (и есть хорошая вероятность, что он это делает), вы можете отказаться от класса функции и просто определить выполнение следующим образом:
void MyClass::run()
{
auto f = [this](int i) {
return obj_->funcAnother(i);
};
compute(f);
}
Поскольку
funcAnother(int i);
является функцией-членом, он передает неявный this
, а затем прототип не соответствует типу вашего указателя функции.
Типпечатание для указатель на функцию-член должен быть:
typedef double (AnotherClass::*funcPtr)(int);
Здесь - модифицированная компилируемая версия вашего кода. Пожалуйста, ознакомьтесь со встроенными комментариями, чтобы понять изменения. Также я оставил другие детали, вы можете добавить это.