Я реализовал GoogleTest, с классом приспособления UnitTest_solver
, Реализация для светильника заключается в следующем. Содержит вспомогательные функции
class UnitTest_solver : public ::testing::Test
{
protected:
static void SetUpTestCase()
{
// setup table with data
m_col = 2;
m_row = 100;
// other things to initialize m_test_data
}static void TearDownTestCase()
{
for(int i = 0 ; i < m_row ; i++)
delete[] m_test_data[i];
delete[] m_test_data;
}static double chi_sqr(double* x)
{
if(m_col < 2)
return 0;
double fx = 0;
double * row_i = new double[m_col - 1];
for(int i = 0 ; i < m_row ; i++)
{
for(int j = 0 ; j < m_col - 1 ; j++)
row_i[j] = m_test_data[i][j];
fx += pow(m_test_data[i][0] - func_1(x, row_i, m_col - 1), 2.0);
}
return fx;
}static double func_1(double* x, double* dbl, int nb_param)
{
if(nb_param != 2)
return 0;
return x[0] * exp(-1 * x[1] * dbl[0]);
}
static double UnitTest_solver::functPtr( double * parameters, void * userinfo)
{
return chi_sqr(parameters);
}
static ofstream thing;
static double** m_test_data;
static int m_col, m_row;
};
Кроме того, из области видимости я инициализирую статические переменные. Последний указатель на функцию. синтаксис определения в порядке?
double** UnitTest_solver::m_test_data = 0;
int UnitTest_solver::m_col = 0;
int UnitTest_solver::m_row = 0;
double (UnitTest_solver::*functPtr)(double * , void *) = 0;
Затем у меня есть тестовый пример со ссылкой на прибор UnitTest_solver.
TEST_F(UnitTest_solver, testFunc1)
{
Solver* solversqp = new Solver();
solversqp->set_pointer_to_function(UnitTest_solver::functPtr, (void*)0);
//...
}
вторая строка показывает ошибку времени компиляции с UnitTest_solver::functPtr
: когда мышь находится над ошибкой, информация «функция, определенная в строке xxx, недоступна», где xxx указывает на functPtr
определение внутри светильника.
Если я запускаю ggltest, комментируя последнюю строку, solversqp->set_pointer_to_function(UnitTest_solver::functPtr, (void*)0);
тест заканчивается (если я поставил тривиальный ASSERT, он успешен).
Что не так с моим определением указателя функции.
Я не вижу полный код, поэтому это только предположение.
Все в class UnitTest_solver
защищен, поэтому все (кроме классов, наследующих этот класс) не имеют доступа к его членам. Измените его на общедоступный, и ваша проблема будет решена:
class UnitTest_solver : public ::testing::Test
{
// protected:
public:
Других решений пока нет …