啊当 发表于 2013-9-1 10:38

问个C++的问题

有个sqlite类的函数有个回调函数
声明是这么写的
SQLITE_API int sqlite3_exec(
  sqlite3*,                                  /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
);

其中第三个参数就是一个回调函数
我申明了一个方法是这样的:int QuoridorAI::loadRecord( void * para, int n_column, char ** column_value, char ** column_name)
QuoridorAI为类名

我调用sqlite函数的方法是这样的:
result = sqlite3_exec( db, sql->getCString(),loadRecord, &count, &errMsg );
这样调用编译不过。。。怎么破

错误提示:
        2        IntelliSense: "int (QuoridorAI::*)(void *para, int n_column, char **column_value, char **column_name)" 类型的实参与 "int (*)(void *, int, char **, char **)" 类型的形参不兼容        d:\cocos2d-x-2.1.5\quoridor\proj.win32\quoridorai.cpp        64        51        Quoridor.win32

如果我把我自己申明的方法中QuoridorAI::去掉,那么这个回调函数里就没法访问QuoridorAI的变量
非常闹心啊

热啊 发表于 2013-9-1 13:10

loadRecord 设置为静态函数试试

Neutrino 发表于 2013-9-1 13:57

废话,loadRecord是个成员函数,你这样能编译过才怪
你得先定义一个对象QuoridorAI *qa = new QuoridorAI(); 传qa->loadRecord(...)进去

assassin99 发表于 2013-9-1 14:00

8da真他妈牛人多,操

my8dacart 发表于 2013-9-1 14:27

牛clear 发表于 2013-9-1 15:36

C++成员函数要看具体编译器的实现方法,大多都是基于vtable
正解是用使用static函数。

热啊 发表于 2013-9-1 16:13

直接召唤木天使好么

Neutrino 发表于 2013-9-1 16:28

牛clear 发表于 2013-9-1 15:36 static/image/common/back.gif
C++成员函数要看具体编译器的实现方法,大多都是基于vtable
正解是用使用static函数。

草,先去baidu一下什么是vtable好吗?

tangsa 发表于 2013-9-1 16:31

。。。。。。。。。。。。。。。。
8da藏龙卧虎,我在想是不是去应聘个程序员的岗位,然后把每日工作发到8da来,月入2W+

热啊 发表于 2013-9-1 16:33

lz调用的时候直接调用成员函数应该是笔误吧

朴善英 发表于 2013-9-1 16:53

8da真他妈牛人多,操

=C.R=LanBinG 发表于 2013-9-1 16:54

SQLITE_API int sqlite3_exec(
  sqlite3*,                                  /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
);

int QuoridorAI::loadRecord( void * para, int n_column, char ** column_value, char ** column_name)

//result = sqlite3_exec( db, sql->getCString(),loadRecord, &count, &errMsg );

呵呵,编译器的提示是对的。

QuoridorAI ai;
sqlite3_exec(db,sql->getCString(),std::bind(&QuoridorAI::loadRecord,&ai),
        &count, &errMsg);


或者你是在QuoridorAI类里面的话,可以这么调用
sqlite3_exec(db,sql->getCString(),std::bind(&QuoridorAI::loadRecord,this),
        &count, &errMsg);

用户名掉包了 发表于 2013-9-1 16:56

C++当年哥也会啊

Co哥 发表于 2013-9-1 17:14

当哥说说在做啥游戏啊,这是cocos哈哈

刁总书记 发表于 2013-9-1 17:15

牛clear 发表于 2013-9-1 15:36 static/image/common/back.gif
C++成员函数要看具体编译器的实现方法,大多都是基于vtable
正解是用使用static函数。

vtable是分析多态才用到的概念吧  和楼主说的好像没啥关系

又打出gg了 发表于 2013-9-1 17:19

牛clear 发表于 2013-9-1 18:24

Neutrino 发表于 2013-9-1 16:28 static/image/common/back.gif
草,先去baidu一下什么是vtable好吗?

[:41] 装逼被破,尴尬。

牛clear 发表于 2013-9-1 18:26

刁总书记 发表于 2013-9-1 17:15 static/image/common/back.gif
vtable是分析多态才用到的概念吧  和楼主说的好像没啥关系

哈哈,戳穿了

ama_go 发表于 2013-9-1 19:43

本屌只会C语言,但是本屌的程序是控制机器人的

说谎の天使 发表于 2013-9-1 20:58

CPP在企业应用软件行业里已死。太难学难精了。

zerg王 发表于 2013-9-1 22:36

this...

国妓米兰 发表于 2013-9-1 23:23

能和各位精英一个论坛 真是荣幸   
页: [1]
查看完整版本: 问个C++的问题