函数指针作为类的成员函数的参数传入,有什么问题吗?

时间:2021-01-18 18:47:59
代码如下:
下面代码定义在一个头文件header.h中
class CMyClass;
typedef void (CMyClass::*my_handler)(void *arg);

struct my_str
{
   ...
   my_handler* h;
   void* arg;
};

下面是类的定义
class CMyClass
{
   .....
   MyFun1(int nFlag,my_handler,void* arg);
   //变量定义
   my_str my;
}

CMyClass::MyFun1(int nFlag,my_handler handler1,void* arg)
{
  my.h = handler1;
  ....
}
//在其他地方会调用my.h
...

这样的的代码VC编译没有问题,使用似乎也没有问题,定义一个CMyClass my1的变量,运行起来也没有问题,想问的是,如果定义多个CMyClass 的变量,比如my1,my2,my3...等,各个实例变量在执行MyFun1时,会不会出现冲突或者其他问题?

11 个解决方案

#1


不必担心这个问题,编译器在编译你的程序的时候已经将所有的名字换掉了.所以你看到的和编译器看到的是不一样的. 函数指针作为类的成员函数的参数传入,有什么问题吗?

#2


能有什么样的冲突?
成员函数指针类型的变量 和普通变量能有什么区别?

#3


不会有冲突的 函数指针作为类的成员函数的参数传入,有什么问题吗?

#4


如果你的类中有一个static成员变量,而且MyFun1()中对它有写操作,那就可能会冲突了。

没有static 成员,每个实例都是独立的,不会有影响。

#5


类的其他成员函数会调用MyFun1,比如

下面是类的定义
class CMyClass
{
   .....
   MyFun2(int n);
   myHandler1(void* arg);
   MyFun1(int nFlag,my_handler,void* arg);
   //变量定义
   my_str my;
}

CMyClass::MyFun1(int nFlag,my_handler handler1,void* arg)
{
  my.h = handler1;
  ....
}

CMyClass::MyFun2(int n)
{
  MyFun1(0,myHandler1,NULL);
}

// 这个就是typedef void (CMyClass::*my_handler)(void *arg);在类中的一个实现,如果有很多CMyClass实例变量,这个函数MyHandler1执行起来会不会和其他的实例变量冲突或者带来什么问题?
CMyClass:: myHandler1(void* arg)
{
 //
 ...
}

#6


你想太多了
你所谓的 "冲突" 是什么?
在 a 对象上调用方法修改到了 b 对象的数据?  这是不可能的. 成员函数指针和普通函数指针没有什么区别, 指针里面并不会包含对象的信息. 你在哪个对象上调用函数指针, 它就操作哪个对象.

你如果怀疑什么, 自己试验下不就清楚了? 你这样的描述, 沟通成本太高, 花的时间比自己试验出结果的时间还多.

#7


不会,当你创建一个对象的时候,每个对象都各自维护着自己的成员的,所以当你调用时候都是调用指定对象的function~ 不存在任何的冲突,除非你存在多继承/多重继承情况下~ 

#8


用作成员函数参数没有问题的。。

#9


其实我能理解楼主的意思,他意思是说,因为这个函数是 指针形式 的,产生很多实例(my1,my2,my3...)的时候,都指向同一个函数体,就认为这个 函数 是很多实例共享的。在一个多线程并发的情况下,my1的函数在运行时,my2也同时传入数据,造成混乱。

尤其在my1 = my2的情况下,如果按照 "位"复制,my1和my2有可能造成混乱。

这就像在这个类中,如果有指针类型的成员变量,复制的时候,有深度复制和浅度复制一样。

这个还真不好回答,但是貌似成员函数指针和普通函数指针还是有区别的,貌似区别还不小。

http://blog.csdn.net/eroswang/article/details/4153356

#10


不会有什么冲突。

#11


不会冲突的,多实例都是使用自己的成员方法。

#1


不必担心这个问题,编译器在编译你的程序的时候已经将所有的名字换掉了.所以你看到的和编译器看到的是不一样的. 函数指针作为类的成员函数的参数传入,有什么问题吗?

#2


能有什么样的冲突?
成员函数指针类型的变量 和普通变量能有什么区别?

#3


不会有冲突的 函数指针作为类的成员函数的参数传入,有什么问题吗?

#4


如果你的类中有一个static成员变量,而且MyFun1()中对它有写操作,那就可能会冲突了。

没有static 成员,每个实例都是独立的,不会有影响。

#5


类的其他成员函数会调用MyFun1,比如

下面是类的定义
class CMyClass
{
   .....
   MyFun2(int n);
   myHandler1(void* arg);
   MyFun1(int nFlag,my_handler,void* arg);
   //变量定义
   my_str my;
}

CMyClass::MyFun1(int nFlag,my_handler handler1,void* arg)
{
  my.h = handler1;
  ....
}

CMyClass::MyFun2(int n)
{
  MyFun1(0,myHandler1,NULL);
}

// 这个就是typedef void (CMyClass::*my_handler)(void *arg);在类中的一个实现,如果有很多CMyClass实例变量,这个函数MyHandler1执行起来会不会和其他的实例变量冲突或者带来什么问题?
CMyClass:: myHandler1(void* arg)
{
 //
 ...
}

#6


你想太多了
你所谓的 "冲突" 是什么?
在 a 对象上调用方法修改到了 b 对象的数据?  这是不可能的. 成员函数指针和普通函数指针没有什么区别, 指针里面并不会包含对象的信息. 你在哪个对象上调用函数指针, 它就操作哪个对象.

你如果怀疑什么, 自己试验下不就清楚了? 你这样的描述, 沟通成本太高, 花的时间比自己试验出结果的时间还多.

#7


不会,当你创建一个对象的时候,每个对象都各自维护着自己的成员的,所以当你调用时候都是调用指定对象的function~ 不存在任何的冲突,除非你存在多继承/多重继承情况下~ 

#8


用作成员函数参数没有问题的。。

#9


其实我能理解楼主的意思,他意思是说,因为这个函数是 指针形式 的,产生很多实例(my1,my2,my3...)的时候,都指向同一个函数体,就认为这个 函数 是很多实例共享的。在一个多线程并发的情况下,my1的函数在运行时,my2也同时传入数据,造成混乱。

尤其在my1 = my2的情况下,如果按照 "位"复制,my1和my2有可能造成混乱。

这就像在这个类中,如果有指针类型的成员变量,复制的时候,有深度复制和浅度复制一样。

这个还真不好回答,但是貌似成员函数指针和普通函数指针还是有区别的,貌似区别还不小。

http://blog.csdn.net/eroswang/article/details/4153356

#10


不会有什么冲突。

#11


不会冲突的,多实例都是使用自己的成员方法。