下面代码定义在一个头文件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 成员,每个实例都是独立的,不会有影响。
没有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)
{
//
...
}
下面是类的定义
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 对象的数据? 这是不可能的. 成员函数指针和普通函数指针没有什么区别, 指针里面并不会包含对象的信息. 你在哪个对象上调用函数指针, 它就操作哪个对象.
你如果怀疑什么, 自己试验下不就清楚了? 你这样的描述, 沟通成本太高, 花的时间比自己试验出结果的时间还多.
你所谓的 "冲突" 是什么?
在 a 对象上调用方法修改到了 b 对象的数据? 这是不可能的. 成员函数指针和普通函数指针没有什么区别, 指针里面并不会包含对象的信息. 你在哪个对象上调用函数指针, 它就操作哪个对象.
你如果怀疑什么, 自己试验下不就清楚了? 你这样的描述, 沟通成本太高, 花的时间比自己试验出结果的时间还多.
#7
不会,当你创建一个对象的时候,每个对象都各自维护着自己的成员的,所以当你调用时候都是调用指定对象的function~ 不存在任何的冲突,除非你存在多继承/多重继承情况下~
#8
用作成员函数参数没有问题的。。
#9
其实我能理解楼主的意思,他意思是说,因为这个函数是 指针形式 的,产生很多实例(my1,my2,my3...)的时候,都指向同一个函数体,就认为这个 函数 是很多实例共享的。在一个多线程并发的情况下,my1的函数在运行时,my2也同时传入数据,造成混乱。
尤其在my1 = my2的情况下,如果按照 "位"复制,my1和my2有可能造成混乱。
这就像在这个类中,如果有指针类型的成员变量,复制的时候,有深度复制和浅度复制一样。
这个还真不好回答,但是貌似成员函数指针和普通函数指针还是有区别的,貌似区别还不小。
http://blog.csdn.net/eroswang/article/details/4153356
尤其在my1 = my2的情况下,如果按照 "位"复制,my1和my2有可能造成混乱。
这就像在这个类中,如果有指针类型的成员变量,复制的时候,有深度复制和浅度复制一样。
这个还真不好回答,但是貌似成员函数指针和普通函数指针还是有区别的,貌似区别还不小。
http://blog.csdn.net/eroswang/article/details/4153356
#10
不会有什么冲突。
#11
不会冲突的,多实例都是使用自己的成员方法。
#1
不必担心这个问题,编译器在编译你的程序的时候已经将所有的名字换掉了.所以你看到的和编译器看到的是不一样的.
#2
能有什么样的冲突?
成员函数指针类型的变量 和普通变量能有什么区别?
成员函数指针类型的变量 和普通变量能有什么区别?
#3
不会有冲突的
#4
如果你的类中有一个static成员变量,而且MyFun1()中对它有写操作,那就可能会冲突了。
没有static 成员,每个实例都是独立的,不会有影响。
没有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)
{
//
...
}
下面是类的定义
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 对象的数据? 这是不可能的. 成员函数指针和普通函数指针没有什么区别, 指针里面并不会包含对象的信息. 你在哪个对象上调用函数指针, 它就操作哪个对象.
你如果怀疑什么, 自己试验下不就清楚了? 你这样的描述, 沟通成本太高, 花的时间比自己试验出结果的时间还多.
你所谓的 "冲突" 是什么?
在 a 对象上调用方法修改到了 b 对象的数据? 这是不可能的. 成员函数指针和普通函数指针没有什么区别, 指针里面并不会包含对象的信息. 你在哪个对象上调用函数指针, 它就操作哪个对象.
你如果怀疑什么, 自己试验下不就清楚了? 你这样的描述, 沟通成本太高, 花的时间比自己试验出结果的时间还多.
#7
不会,当你创建一个对象的时候,每个对象都各自维护着自己的成员的,所以当你调用时候都是调用指定对象的function~ 不存在任何的冲突,除非你存在多继承/多重继承情况下~
#8
用作成员函数参数没有问题的。。
#9
其实我能理解楼主的意思,他意思是说,因为这个函数是 指针形式 的,产生很多实例(my1,my2,my3...)的时候,都指向同一个函数体,就认为这个 函数 是很多实例共享的。在一个多线程并发的情况下,my1的函数在运行时,my2也同时传入数据,造成混乱。
尤其在my1 = my2的情况下,如果按照 "位"复制,my1和my2有可能造成混乱。
这就像在这个类中,如果有指针类型的成员变量,复制的时候,有深度复制和浅度复制一样。
这个还真不好回答,但是貌似成员函数指针和普通函数指针还是有区别的,貌似区别还不小。
http://blog.csdn.net/eroswang/article/details/4153356
尤其在my1 = my2的情况下,如果按照 "位"复制,my1和my2有可能造成混乱。
这就像在这个类中,如果有指针类型的成员变量,复制的时候,有深度复制和浅度复制一样。
这个还真不好回答,但是貌似成员函数指针和普通函数指针还是有区别的,貌似区别还不小。
http://blog.csdn.net/eroswang/article/details/4153356
#10
不会有什么冲突。
#11
不会冲突的,多实例都是使用自己的成员方法。