4

我想访问这个静态成员函数中的数据。现在成员函数是静态的,因此我可以将它与用 C 编写的第三方 API 一起使用,该 API 具有用于回调目的的 typdef 函数指针。根据下面的信息,为了在我的类的其他非静态成员函数中使用来自以下函数成员的数据,绕过创建静态函数的需要的最佳方法是什么。也许有一种方法仍然可以使用这个静态函数,但仍然可以克服无法将静态变量与非静态变量混合的问题。我的代码按原样工作,但无法访问以下回调函数中的数据。

void TextDetect::vtrCB(vtrTextTrack *track, void *calldata) /*acts as a callback*/
{
/*specifically would like to take data from "track" to a deep copy so that I don't loose   scope over the data withing that struct */

}

在用 C 编写的相关 API 中,我被迫使用以下两行代码:

 typedef void (*vtrCallback)(vtrTextTrack *track, void *calldata);
 int vtrInitialize(const char *inifile, vtrCallback cb, void *calldata);

这是我班级的标题:

 #include <vtrapi.h>
 #include <opencv.hpp>

 class TextDetect {
const char * inifile;
vtrImage *vtrimage;
int framecount;
 public:
TextDetect();
~TextDetect();
static void vtrCB(vtrTextTrack *track, void *calldata);
int vtrTest(cv::Mat);
bool DrawBox(cv::Mat&);

  };


  TextDetect::TextDetect() : inifile("vtr.ini")
  {
if (vtrInitialize(inifile, vtrCB /*run into problems here*/, NULL) == -1)
    std::cout << "Error: Failure to initialize" << std::endl;
vtrimage = new vtrImage;
framecount = 0;

  }

  void TextDetect::vtrCB(vtrTextTrack *track, void *calldata) /*acts as a callback*/
 {
/*specifically would like to take data from "track" to a deep copy so that I don't loose   scope over the data withing that struct */

 }
4

1 回答 1

7

我不确定我是否了解您的确切情况,但这是将 C++ 方法包装到 C 回调 API 中的标准习惯用法:

/*regular method*/
void TextDetect::vtrCB(vtrTextTrack *track)
{
   // do all the real work here
}

/*static method*/
void TextDetect::vtrCB_thunk(vtrTextTrack *track, void *data)
{
   static_cast<TextDetect *>(data)->vtrCB(track);
}

然后,假设应该调用的函数vtrInitialize也是一个TextDetect方法,你可以这样编写调用:

   vtrInitialize(inifile, TextDetect::vtrCB_thunk, static_cast<void *>(this));
于 2012-07-16T21:54:58.207 回答