data member 指针的问题

gaijiaofan 2007-08-24 10:15:00
深度探索c++对象模型
class A
{
public:
int m;
int n;
};

int main()
{
A a;
printf("%d,%d",&A::m-1,&A::n);
}

编译有错误:
error C2296: '-' : illegal, left operand has type 'int A::*'

我用的是vc6.0, 用g++也是如此。

但书上明明有这样的例子啊。p98.
...全文
140 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
MulinB 2007-08-24
  • 打赏
  • 举报
回复
楼上正解……

data member pointer, 也应该有个对应的对象,然后进行对象内的指针偏移。

->*

这个运算符正是这个用途。
www_adintr_com 2007-08-24
  • 打赏
  • 举报
回复
成员指针只能赋值,不能加减,可以用 union_cast 来转成 int
www_adintr_com 2007-08-24
  • 打赏
  • 举报
回复
(&a)->*(&A::m) 等价于 a.m
gaijiaofan 2007-08-24
  • 打赏
  • 举报
回复
我知道你门的意思。

我现在的意思是 &A::m 是一个A::* 的指针,书上说可以直接-1。p98。
但我现在用vc6.0 编译会报错。并且也不能类型强制转换(int).

假如我试图用&a+ &A::m 打印m的值的话,编译也不能通过。那该怎么办呢。(vc6.0 偏移量没有加`1)
www_adintr_com 2007-08-24
  • 打赏
  • 举报
回复
&a.m 和 &A::m 含义不一样的。
我啃 2007-08-24
  • 打赏
  • 举报
回复
printf("%d,%d",&a.m-1,&a.n);
taodm 2007-08-24
  • 打赏
  • 举报
回复
指向成员的指针,只能转换成bool,这是C++标准规定的,没啥讨价还价的余地。不要钻牛角尖。
gaijiaofan 2007-08-24
  • 打赏
  • 举报
回复
to adlay

你说的我明白了。
谢谢
但我现在还有个问题。为什么不能直接转换为int类型呢?
(int)&A::m
如果能转化的话,就可以减1了。
我想这个指针也是在内存中占了4个字节单元啊。(function member 指针可能不止4个)
但不论几个字节,这样转化至少编译应该通过的啊。
谢谢

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧