Chinaunix
标题:
C++类成员函数指针的问题
[打印本页]
作者:
lrh3025
时间:
2005-11-22 15:50
标题:
C++类成员函数指针的问题
想把类的成员函数的指针放到一个成员数组里,如何实现呢?
typedef void(A::*FUN)();
class A
{
public:
void init();
void fun( int );
private:
void fun1( ){}
void fun2( ){}
private:
FUN m_funs[2];
};
void A::init( )
{
m_funs[0] = fun1;
m_funs[1] = fun2;
}
void fun( int i )
{
m_funs[i]();
}
谢谢了!!!!
作者:
whyglinux
时间:
2005-11-22 16:41
class A; // Add the declaration of class A.
typedef void(A::*FUN)();
class A
{
public:
void init();
void fun( int );
private:
void fun1( ){}
void fun2( ){}
private:
FUN m_funs[2];
};
void A::init( )
{
// m_funs[0] = fun1;
// m_funs[1] = fun2;
m_funs[0] = &A::fun1;
m_funs[1] = &A::fun2;
}
// void fun( int i )
void A::fun( int i )
{
// m_funs[i]();
(this->*m_funs[i])();
}
复制代码
作者:
renstone921
时间:
2005-11-22 17:39
#include <iostream>
using namespace std;
class A; //前制声明
typedef void (A::*FUN)(); //定义了一个成员函数指针类型,该类型的函数定义在class A范围内,接受void参数,返回void类型
class A
{
friend void fun(A&, int); //要访问类的私有成员,必须声明该函数为类的友元,同时,为了存取对象的数据,必须传入一个对象的实例作为参数
public:
void init();
private
void fun1( )
{
cout << "func1" << endl;
}
void fun2( )
{
cout <<"func2" << endl;
}
private:
FUN m_funs[2];
};
//想知道你这样做的目的是什么?
//作为一个成员函数,它实际上有在编译期内确定的意味,所以,A::fun1是每个类一个的,而不应当是每个实例一个的,也就是说,m_funs应当是一个static的成员变量(per class),而不是per instance。
void A::init( )
{
m_funs[0]= &A::fun1; //应当是类A域里的函数的地址
m_funs[1] = &A::fun2;
}
void fun(A& a, int i)
{
(a.*(a.m_funs[i]))(); //m_funs是对象a中的一个数组,该数组的元素是一个FUN类型的指针
}
int main()
{
A a;
a.init();
fun(a, 0);
fun(a, 1);
return (0);
}
复制代码
作者:
lrh3025
时间:
2005-11-22 17:49
标题:
谢谢了!!
谢谢了!!!!!!!
涕零啊 ̄
作者:
gooderfeng
时间:
2005-11-22 18:37
//作为一个成员函数,它实际上有在编译期内确定的意味,所以,A::fun1是每个类一个的,而不应当是每个实例一个的,也就是说,m_funs应当是一个static的成员变量(per class),而不是per instance。
受教啊。如果不是static,其他的情况就没有一点意义了,我觉得,除非是public数组调用私有函数
作者:
柳五随风
时间:
2005-11-22 22:40
典型的用C来思考C++.
没有任何意义.
作者:
whyglinux
时间:
2005-11-23 09:34
原帖由
柳五随风
于 2005-11-22 22:40 发表
典型的用C来思考C++.
没有任何意义.
对于同一个问题,往往由于人们站的角度不同或者视野受到的局限性,对这个问题会有不同甚至相反的看法:在我眼中一文不值的一块甲骨龟片,对于考古学者来说却是无价之宝。这是很正常的,符合辨正法。
说这些话的意思是:我们可以畅所欲言,发表自己的看法;但是不要轻易否定别人的观点以及行为,或者说不要轻易下结论,因为彼此的立场和看问题的角度可能是不同的。比如,对于这个程序来说,如果你能正确地实现楼主的要求,从而掌握或者加深了解关于成员函数指针的概念(成员函数指针比一般的指针无论在概念上还是操作上都要复杂一些),不也是很有意义的吗?
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2