0

フィクスチャ クラス を使用して 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);
    //...
}

2 行目はコンパイル時のエラーを示していますUnitTest_solver::functPtr。マウスがエラーの上にある場合、情報は「xxx で定義された関数はアクセスできません」であり、xxxfunctPtrはフィクスチャ内の定義を指しています。

最後の行にコメントを付けて ggltest を実行するとsolversqp->set_pointer_to_function(UnitTest_solver::functPtr, (void*)0);、テストが終了します (些細な ASSERT を入れれば成功です)。

関数ポインタの定義が間違っています。

4

1 に答える 1

1

完全なコードが表示されないため、これは単なる推測です。

のすべてclass UnitTest_solverが保護されているため、すべて(このクラスを継承するクラス以外)はそのメンバーにアクセスできません。公開に変更すると、問題は解決します:

class UnitTest_solver : public ::testing::Test
{

// protected: 
public:
于 2012-10-04T09:33:30.020 に答える