假设我定义了一个类:
class A{
public:
void f1();
void f2();
void f3();
...
private:
...
};
我在另一个文件中定义了一个结构和一个数组:
struct M{
char * title;
void (*f)();
};
M test[] = {
{"f1",A::f1},
{"f2",A::f2},
{"f3",A::f3},
{NULL,NULL}
};
我在类B中用到这个数组,目的是根据一个下标值调用相应的函数,当有新的函数增加时,只要在数组中加入一行就可.
class B{
public:
void g(int i){//忽略错误检查;
t->test[i].f;
};
private ;
A *t;
};
结果在数组初始化时通不过编译,class B我还没测试。
请各位高手指点。
将
void (*f)();
改为:
void (A::*f)();
struct M{
char * title;
void (A::*f)(void); //<<-----
};
class B{
private:
A *t;
public:
void g(int i){
(t->*(test[i].f))(); // <<-----
}
};
错误在于A中的函数f1,f2,f3没有实例化,而在结构M中企图使用它。
想法挺好,不过问题不小
我再想想
老兄!真是佩服你!
你知道,mfc里的的消息机制就用了和你的设想相同的做法的!
如果你想看到更多的内容,你可以看看候捷的<深入浅出mfc>.
你的做法有点问题.
假设我定义了一个类:
class A{
public:
void f1();
void f2();
void f3();
...
private:
//好象要在这里
X test[];
...
};
这样定义结构体:
typedef struct M{
char * title;
void (*f)();
}X;
//
test[] = {
{"f1",A::f1},
{"f2",A::f2},
{"f3",A::f3},
{NULL,NULL}
};
//
噢,后面的做法我忘了语法了~
你去看看mfc的declaremessagemap和beginmessagemap和endmessagemap
宏!