首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求问大神一个简单的类型有关问题

2013-09-28 
求问大神一个简单的类型问题昨天看C++ Template中一个辨别类型的例子,其中使用了一个类型int C::*请问这是

求问大神一个简单的类型问题
昨天看C++ Template中一个辨别类型的例子,其中使用了一个类型
int C::*
请问这是个什么类型呢?

代码如下:
template<typename T>
class IsClass
{
private:
  typedef char One;
  typedef struct{ char[2]; } Two;
  template<typename C> static One test(int C::*); 
  template<typename C> static Two test(...);
public:
  enum{ Yes = sizeof(IsClass<T>::test<T>(0)) == 1);
  enum{ No = !Yes};
};
类型辨别 C++ int?C::*
[解决办法]

引用:
Quote: 引用:

int C::*表示参数类型为类C的一个int型指针成员
因为类成员指针和普通的指针不一样,类成员指针是在类指针基础上的一个偏移,不是一个直接的内存地址偏移(我个人认为类地址都不固定,直接指向其成员的指针也不固定,但如果类地址固定了,那么是不是可以直接用普通指针指向其成员函数指针呢?我也不知道……等待大牛),::*就是这样一个写法


原来如此,我试了试,int* 不能直接转换成int C::*,那么能否理解成“类C中特有的int*”呢?

其实也不是说特有,引用任何类中的成员指针都可以::*这么写……
具体原因还是我上面说的,我也是从一本书上看到的,不过很久了就记不清了,只记得大概。
或者这么说吧,如果是一个简单类,有几个成员,有几个普通成员函数,::*应该在本质上和*没啥区别;但比方说如果这个类成员存在虚函数,存在多重继承,貌似*真的很难对应上::*;很直观的一点,基类成员指针的偏移,和子类中这个成员指针的偏移是否一样呢?显然第二个父类的偏移不会和子类的偏移一样,因为中间还有第一个父类的成员要存放……这样看来,还是用::*合理。
[解决办法]




引用:
Quote: 引用:

Quote: 引用:

int C::*表示参数类型为类C的一个int型指针成员
因为类成员指针和普通的指针不一样,类成员指针是在类指针基础上的一个偏移,不是一个直接的内存地址偏移(我个人认为类地址都不固定,直接指向其成员的指针也不固定,但如果类地址固定了,那么是不是可以直接用普通指针指向其成员函数指针呢?我也不知道……等待大牛),::*就是这样一个写法


原来如此,我试了试,int* 不能直接转换成int C::*,那么能否理解成“类C中特有的int*”呢?

其实也不是说特有,引用任何类中的成员指针都可以::*这么写……
具体原因还是我上面说的,我也是从一本书上看到的,不过很久了就记不清了,只记得大概。
或者这么说吧,如果是一个简单类,有几个成员,有几个普通成员函数,::*应该在本质上和*没啥区别;但比方说如果这个类成员存在虚函数,存在多重继承,貌似*真的很难对应上::*;很直观的一点,基类成员指针的偏移,和子类中这个成员指针的偏移是否一样呢?显然第二个父类的偏移不会和子类的偏移一样,因为中间还有第一个父类的成员要存放……这样看来,还是用::*合理。


理解的很对.
在<<深度探索C++模型>>上提到过这类用法

int C::*

就是 class C 中一个成员变量, 类型是int
[解决办法]
楼主,换本教材吧。连指向成员的指针都没讲的,可以直接扔了。

热点排行