将对象传递给类并在同一个类中的静态函数中调用它

时间:2017-12-10 17:12:50

标签: c++ static

我正在使用gdal做一些栅格工作,它有一个GDALWarpAppOptionsSetProgress函数,它获取一个静态函数来显示它的进程。在这里你可以找到它的链接:http://www.gdal.org/gdal__utils_8h.html#a6ed3c9681cabcfcbd6fc87d427762482 和这个链接

http://gdal.sourcearchive.com/documentation/1.6.0/gdal_8h_5703b651695c0cbe6f3644a0a18dda8b.html

我知道我必须编写一个静态函数来使用它,这是我的函数

static int My_FN_GDALTermProgress( double dfComplete, const char *pszMessage, void *pData)
{

    if(progressBar){
        progressBar->setValue(FN_GDAL_PROGRESS_VALUE);
    }
  double FN_GDAL_PROGRESS_VALUE = dfComplete * 100;
   return TRUE;
}

我有一个名为gdal_dem的类,就像这样

#include "gdal_dem.h"
#include "gdal_wrap.h"
#include <qdebug.h>
#include <iostream>
#include "cpl_string.h"
#include "gdal_priv.h"
#include "ogr_spatialref.h"
#include "gdal_utils_priv.h"
#include "cpl_error.h"
#include <QString>
#include "commonutils.h"
#include <QFile>
gdal_dem::gdal_dem(QString SrcFilename):
    SrcFile(SrcFilename)
{


}


float FN_GDAL_PROGRESS_VALUE = 0.0f;

static int  My_FN_GDALTermProgress(double dfComplete,
                                  CPL_UNUSED const char * pszMessage,
                                  CPL_UNUSED void * pProgressArg )
{
    FN_GDAL_PROGRESS_VALUE = dfComplete * 100;
    printf("Progress: %f\n",FN_GDAL_PROGRESS_VALUE);
    return true;
}

////


int gdal_dem::colorrelief(QString Dstanationfile,QString colorfile){



   .....
        if(!(psOptionsForBinary->bQuiet))
{
    prgFunc=My_FN_GDALTermProgress;
    GDALDEMProcessingOptionsSetProgress(psOptions, prgFunc,NULL);
}


    ......
}

在上面的代码中我可以在处理选项中设置上面提到的功能,它工作正常。但我的问题是当我想更新进度条时。我有一个QProgressBar,它在我的主要课程中。如何将其传递给静态函数?我试过这些方法: 1-我试图在我的gdal_dem中获取进度条,并在gdal_dem中定义了一个静态变量并尝试设置其值并在My_FN_GDALTermProgress中更新它,问题是因为progressbar也是静态的我可以在wrap.cpp的承包商中看到它, 2 - 我试图在我的主应用类中定义一个新的My_FN_GDALTermProgress函数,但它必须是静态的,我遇到了这个错误cannot declare member function to have static linkage

3-我也试过这种方法,但它不起作用 https://www.badprog.com/c-errors-warnings-cannot-declare-member-function-static-void-myclassmymethod-to-have-static-linkage

那么,如何将参数传递给我的gdal_dem类并在其中的静态类中更新其值?

1 个答案:

答案 0 :(得分:1)

使用pData参数。注册静态函数时,您可以传递任何想要的内容。在这种情况下,您可以将指针传递给QProgressBar对象:

QProgressBar* qProgBarObj = // ...
GDALDEMProcessingOptionsSetProgress(psOptions, prgFunc, qProgBarObj);

静态函数将接收它作为第三个参数:

static int My_FN_GDALTermProgress(double dfComplete, const char *pszMessage, void *pData)
{
    auto progBar = reinterpret_cast<QProgressBar*>(pData);
    progBar->setValue(/* ... */);
    // ...
}