高手请进!

liguangwen 2004-04-28 03:19:54
刚刚在FAQ里看到一个帖子里讲到在全局函数里得到一个类对象的成员函数的指针,但是有好几个解答看不太明白。


#include "stdafx.h"

#include <iostream>
#include <stdlib.h>

using namespace std;

class CTest{
public:
int a;
void (CTest::* FunPtr[2])();
CTest(int A=0);
~CTest(){cout<<"CTest::~CTest"<<endl;};
void fun1();
void fun2();
};

CTest::CTest(int A):a(A)
{
FunPtr[0]=fun1;
FunPtr[1]=fun2;
cout<<"CTest::CTest"<<endl;
}

void CTest::fun1(){
cout<<"CTest::fun1"<<endl;
return;
}

void CTest::fun2(){
cout<<"CTest::fun2"<<endl;
return;


}

void Global(int a,void(CTest::*b)()){
cout<<"a="<<a<<endl;
(*b)()//不行
(static_cast<CTest*>(0)->*b)(); //高手给出的答案。这个可以,但是这个类型转换是什么意思阿?
((CTest*)0->*b)(); //同上
(((CTest*)0->*b)(); // 同上
}

CTest test1;

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

Global(test1.a,test1.FunPtr[0]);

return 0;
}



(static_cast<CTest*>(0)->*b)(); //高手给出的答案。这个可以,但是这个类型转换是什么意思阿?
((CTest*)0->*b)(); //同上
(((CTest*)0->*b)(); // 同上

这几个类型转换到底是什么意思啊?

...全文
24 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qwertasdfg123 2004-04-30
  • 打赏
  • 举报
回复
CTest ct_ptr = 0; // NULL 也可以。
这句话是错误的。指针才可以为空
liguangwen 2004-04-29
  • 打赏
  • 举报
回复
各位老大好厉害啊!但是Wolf0403(完美废人)(期待有一天。。。)说的The C++ Programming Language书是什么书啊?作者,版本,语言,我好去看啊,谢谢各位啊。

另外,老大说:
0 这里是 C++ 中的一个特点:可以用字面值 0 表示“空指针”(NULL ptr)。所以
(static_cast<CTest*>(0)->*b)();
就差不多是
CTest ct_ptr = 0; // NULL 也可以。
(ct_ptr->*b)();
///////////////

是否应该是:
CTest* t_ptr = 0; // NULL 也可以。
(ct_ptr->*b)();呢?
小弟长了不少见识啊!



不好意思啊,回答了这个问题我才可以给分,揭帖^_^,主要是我只能在办公室上网。
Wolf0403 2004-04-29
  • 打赏
  • 举报
回复
TTTT 该死的 oldjackyone,专门喊我来。。。你自己不都知道嘛

The C++ Programming Language 15.5 节有详细说明,另外附录 B 也有相关内容。
oldjackyone 2004-04-28
  • 打赏
  • 举报
回复
补充: Wolf0403(完美废人)(期待有一天。。。)

(static_cast<CTest*>(0)->*b)(); 这种调用根本就没有任何意义...

如果在void CTest::fun1();里加上一条:cout << a;//出现运行时刻错误.

因为指针指向了0,对于0对象的a成员数据的调用是无意义的.
Wolf0403 2004-04-28
  • 打赏
  • 举报
回复
0 这里是 C++ 中的一个特点:可以用字面值 0 表示“空指针”(NULL ptr)。所以
(static_cast<CTest*>(0)->*b)();
就差不多是
CTest ct_ptr = 0; // NULL 也可以。
(ct_ptr->*b)();

->* 是“成员解除引用操作符”
Wolf0403 2004-04-28
  • 打赏
  • 举报
回复
(static_cast<CTest*>(0)->*b)();

static_cast<> 是 C++ 的四个转换符号之一,表示原始数据类型转换或者派生层次上的类引用/指针转换。对于类对象,如果转换的源和目标不在一个派生体系中,则发生编译错误。
oldjackyone 2004-04-28
  • 打赏
  • 举报
回复
顶一下,留给废人解答...
cnpeople 2004-04-28
  • 打赏
  • 举报
回复
gz!

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧