读书人

小弟有C语言小程序一个,其中一句话不懂

发布时间: 2013-01-08 14:02:13 作者: rapoo

小弟有C语言小程序一个,其中一句话不懂,请教下各位大虾.


#include <cstdio>
#include <iostream>
#include <cstdlib>

using namespace std;

#define AEEVTBL(iname) iname##Vtbl

#define AEEINTERFACE(iname) \
typedef struct AEEVTBL(iname) AEEVTBL(iname); \
struct AEEVTBL(iname)

#define AEEGETVTBL(p, iname) (*((AEEVTBL(iname)**)p))

//声明虚函数列表
AEEINTERFACE(APP)
{
void (*pf)();
};

/*
tydef struct APPVtbl APPVtbl;
struct APPVtbl
{
void (*pf)();
}
*/

typedef struct APP
{
AEEVTBL(APP) *pvt;
}APP;

/*
tydef struct APP
{
APPVtbl *pvt;
}
*/


#define FUN(p) AEEGETVTBL(p, APP)->pf()

/*
(*((AEEVTBL(APP)**)p))->pf()
(*(APPVtbl**)p))->pf()
*/

void f()
{
cout<<"f() is ok"<<endl;
}

void g()
{
cout<<"g() is ok"<<endl;
}

//函数列表1
AEEVTBL(APP) vable = { f };

//函数列表2
AEEVTBL(APP) vable2 = { g };

int main(int argc, char* argv[])
{

APP* pMe = (APP*)malloc(sizeof(APP));

pMe->pvt = &vable;
FUN(pMe);

pMe->pvt = &vable2;
FUN(pMe);
/*
FUN(pMe) 转换后为 (*((APPVtbl**)pMe))->pf()
请问下 (*((APPVtbl**)pMe)) 是什么 意思?
*/

free(pMe);

return 0;
}



以上代码中
有下面的一句
FUN(pMe);

FUN(pMe) 展开后为 (*((APPVtbl**)pMe))->pf()
请问下 (*((APPVtbl**)pMe)) 是什么 意思?
为什么不可以用 (APPVtbl*)pMe->pf()来访问pf()函数

还有就是总感觉 (APPVtbl*)pMe->pf() 与 (*((APPVtbl**)pMe))相同?

[解决办法]
完全不相同,好好体会转型
[解决办法]
(APPVtbl*)pMe 与 (*((APPVtbl**)pMe)) 的区别在于少了一次解引用.
如果 (APPVtbl*)pMe 是指针, (*((APPVtbl**)pMe)) 就是指针的指针.

读书人网 >C++

热点推荐